GDI的一些知识点


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

如何有效更改一个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提供了一个设备环境,以便成员函数在包括非客户区在内的整个屏幕区域内绘图

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章