您的位置:首页 > 其它

GDI的一些知识点

2010-01-09 13:56 106 查看
为何显示的中文是横着的?

如果在各种属性框中选择字体的时候前面有@字符的,显示中文就是横着的,

如何有效更改一个Dialog的背景?

typedef struct tagBITMAP {

LONG bmType;

LONG bmWidth;

LONG bmHeight;

LONG bmWidthBytes;

WORD bmPlanes;

WORD bmBitsPixel;

LPVOID bmBits;

} BITMAP, *PBITMAP; -----BITMAP结构用于定义图像的宽度,高度和颜色格式和图像的值

CBitmap::GetBitmap

int GetBitmap( BITMAP* pBitMap ); ----此函数用于获得图片的信息

返回值为非0,则为成功

CMyGDIView::OnEraseBkgnd函数里应用如下程序,而在CMyGDIView::OnDraw里也可以,但是当重新更改页面大小的时候

OnDraw函数的反应刷新次数太多

CBitmap bitmap;

bitmap.LoadBitmap(IDB_BITMAP1);

BITMAP bmp;

bitmap.GetBitmap(&bmp);

CDC dcCompatible;

dcCompatible.CreateCompatibleDC(pDC);---在内存中创建一个虚拟设备上下文对象,而不立即显示出来

dcCompatible.SelectObject(&bitmap);

CRect rect;

GetClientRect(&rect);---获取客户区的Rect

// pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);---将图像按照1:1的比例进行显示

pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,

0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);----将图像进行变更以合适客户区的尺寸

return true;---不进行下一步的擦除处理,而直接返回,否则会直接擦除刚家加载的背景

怎么初始化一个 COLORREF ?

COLORREF m_color;

m_color=RGB(255,0,0);

怎么选择字体并且显示?

CFontDialog dlg;

if (dlg.DoModal() == IDOK)

{

if(font.m_hObject)

{

font.DeleteObject();

}

font.CreateFontIndirect(dlg.m_cf.lpLogFont);

m_strName=dlg.m_cf.lpLogFont->lfFaceName;

Invalidate(); ---引起窗口重绘

}

以下是显示在OnDraw里的

CFont *pOldFont=pDC->SelectObject(&font);

pDC->TextOut(0,0,m_strName);

pDC->SelectObject(pOldFont);

如何选择颜色并显示?

CColorDialog dlg;

dlg.m_cc.Flags |= CC_RGBINIT | CC_FULLOPEN;

dlg.m_cc.rgbResult=m_clr;---将刚选择的颜色赋回给颜色框体

if(IDOK==dlg.DoModal())

{

m_clr=dlg.m_cc.rgbResult;--获取已经选择的颜色

// m_clr=dlg.GetColor ();---此方法也可以

}

如何控制坐标?

CWindow::ClientToScreen是把坐标从当前窗体转化成全屏幕的!!!

CWindow::ScreenToClient是把屏幕坐标转化成相对当前窗体的坐标!!!!

CWnd::GetWindowRect是取得窗口在屏幕坐标系下的RECT坐标(包括客户区和非客户区),这样可以得到窗口的大小和相对屏幕左上角(0,0)的位置。

CWnd::GetClientRect取得窗口客户区(不包括非客户区)在客户区坐标系下的RECT坐标,可以得到窗口的大小,而不能得到相对屏幕的位置,因为这个矩阵是在客户区坐标系下(相对于窗口客

户区的左上角)的。  

们对同一个窗口先GetWindowRect取得一个RECT,再用ScreenToClient转换到客户坐标系。然后GetClientRect取得一个RECT,再用ClientToScreen转换到屏幕坐标系。显然,GetWindowRect

取得的矩阵不小于GetClientRect取得的矩阵。因为前者包含了非客户区,而后包括了客户区。 

CWindow和CWnd的区别?

CWindow是ATl中封装的窗口类

CWnd是MFC的封装

什么是ATL呢?

Active Template Library (活动模板库)

Template 是C++新标准中源码重用的新工具 本人感觉棒极了

C++ 有 Standard Template Library 提供了相当多的模板

而 ATL是为COM/ActiveX提供的一组开发库,使COM开发简化

WTL = Windows Template Library,可以说起源于 ATL 类库中关于 Window 创建/管理的类。主要原因是用原始的 WIN32 API 编写漂亮的用户界面工作量大,繁杂

。MFC 虽然提供了一套很好的封装,但是也不是很容易消化和使用,特别是各个 MFC 类之间耦合很紧,要用好 MFC 就要理解很多 MFC 内在的运行机制(有人说 MFC 的

封装是“白盒”封装,呵呵)。WTL 利用 C++ 模版的高级功能,提供很联系很松散的“独立”的类库,使用起来比较方便,而且代码体积小,不必为了学习某个类必须学习一大堆相

关的类。

WTL 不是 Microsoft 官方正式支持的类库,虽然有相当多的人和越来越多的在使用;不过有可能将来会支持的

STL = Standard Template Library

CDC/CClientDC/CPaintDC/CWindowDC的区别是什么?

CDC类是所有绘图类的基类。

底下的类都为CDC的派生类

CPaintDC用于模拟相应WM_PAINT的设备环境,这个类中可以使用CDC中的所有函数.

CClientDC它为非响应Windows消息WM_PAINT的成员函数提供了一个设备环境。

CWindowDC提供了一个设备环境,以便成员函数在包括非客户区在内的整个屏幕区域内绘图
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: