《MFC Windows程序设计》读书笔记 重剑无锋 原创
HDC int int );
hdcSrc, nXSrc, nYSrc,
//指定光栅操作代码,先记住一个SRCCOPY:直接拷贝
DWORD dwRop
CDC::StretchBlt ( HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop );
int CBitmap::GetBitmap(BITMAP* pBitMap); bmBits的值为NULL。
typedef struct tagBITMAP{ LONG bmType; LONG bmWidth;
// 位图类型,必须为0 // 位图宽度 // 位图高度 // 颜色平面数 // 像素的位数 // 位图内存指针
得到BITMAP结构的指针,成功则
返回非0。该结构中图像宽度必须是偶数,此外,如果是DDB,则GetBitmap中返回的LPVOID
LONG bmHeight; WORD bmPlanes; WORD bmBitsPixel; LPVOID bmBits; }BITMAP;
LONG bmWidthBytes; // 每一行像素所在的byte数
15.2.3 位图资源
RC文件中: IDB_MYLOGO CPP文件中:
CBitmap bitmap;
bitmap.LoadBitmap(IDB_MYLOGO ) ;
BITMAP
Logo.bmp
15.2.4 DIB和DIB分区
LONG CBitmap::GetBitmapBits (
//将指定位图的位拷贝到缓冲区里
第46页 共 55页
《MFC Windows程序设计》读书笔记 重剑无锋 原创
HBITMAP hbmp, LONG cbBuffer, LPVOID lpvBits );
LONG CBitmap::SetBitmapBits( HBITMAP hmbp, DWORD cBytes, CONST VOID (lpBits) ); HBITMAP
::CreateBitmap(
// 创建DDB位图,API
int nWidth, int nHeight, UINT cPlanes, UINT cBitsPeral,
CONST VOID *lpvBits );
HBITMAP ::CreateDIBitmap( HDC hdc,
// 创建DIB或DDB位图,API // 设备环境句柄
// 指向位图信息头结构的指针 // 位标识集。它指定系统如何对位
//将位图的颜色数据位设置成指定值
CONST BITMAPINFOHEADER *lpbmih, DWORD fdwlnit,
图的位进行初始化,如果fdwlnit是CBM_INIT,那么函数使用位图信息头结构来获取位图所需的宽度、高度以及其他信息 CONST VOID *lpblnit, 类型数组
CONST BITMAPINFO *lpbmi, UINT fuUsage );
fuUsage:表示BITMAPINFO结构的成员bmiColors是否初始化过,并且如果是,那么bmiColors是否包含明确的红、绿、蓝(RGB)值或调色板索引。参数fuUsage必须取下列值中的一个,这些值的含义为:
DIB_PAL_COLORS:表示提供一个颜色表,并且该表由该位图要选入的设备环境的逻辑调色板的16位索引值数组组成。
DIB_RGB_COLORS:表示提供一个颜色表,并且表中包含了原义的RGB值。 返回值:如果函数执行成功,返回值则是创建的位图的句柄;如果函数执行失败,那么返回值为NULL,若想获取更多错误信息,请调用GetLastError函数。
注意高度若是正数,那么表示是自底向上DIB,而负数表示为自顶向下DIB,这种情况与CreateDIBitmap函数兼容。
DIB扩展:可用在DC中选入DIB扩展,并将它按位传递给屏幕,但也可用直接访问位图。
// 指向BITMAPINFO结构的指针 //
// 指向包含初始的位图数据的字节
第47页 共 55页
《MFC Windows程序设计》读书笔记 重剑无锋 原创
15.2.8 再论::LoadImage
HBITMAP hBitmap = (HBITMAP) ::LoadImage( NULL , 文件名,IMAGE_BITMAP,0,0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION );
有了红色字体的部分,才能创建DIB位图,从BITMAP中读取bmBits时,才不会为空。
第16章. 公用控件
16.1 公用控件基础
16.1.1 创建公用控件
? 方法1:
CProgress wndProgress;
wndProgress.Create( WS_CHILD | WS_VISIBLE | WS_BORDER ,
Crect( x1 , y1 , x2 , y2 ) , this , IDC_PROGRESS ) ; ? 方法2:
在对话框模版中:
CONTROL “” , IDC_PROGRESS , PROGRESS_CLASS , WS_BORDER , 32 ,32 ,80 ,16
各种控件都有自己独有的样式,但大多不用 将模版中的控件与变量联系起来:
DDX_CONTROL( pDX , IDC_PROGRESS , m_wndProgress )
16.1.2 处理通知:WM_NOTIFY消息
典型控件:WM_COMMAND 公用控件:WM_NOTIFY 其:
wParam:发送消息的控件子窗口ID lParam:NMHDR或其超集结构的指针 typedef struct tagNMHDR { HWND UINT UINT } NMHDR;
其中,code通知代码有:
hwndFrom; idFrom; code;
// 窗口句柄
// 控件ID = wParam // 通知代码
第48页 共 55页
《MFC Windows程序设计》读书笔记 重剑无锋 原创
NM_CLICK NM_DBLCLK NM_RCLICK ??
注意:大部分控件都定义有自己的通知代码,表示自己特有的事件 ? 消息的映射和反射
封装在WM_NOTIFY中的通知,通过ON_NOTIFY和ON_NOTIFY_RANGE宏映射到类的成员函数,此外,还可用ON_NOTIFY_REFLECT宏将原通知反射回控件本身 例:
ON_NOTIFY( TVN_ITEMEXPANDED , IDC_TREEVIEW , OnItemExpanded ) ON_NOTIFY( TVN_GETDISPINFO , IDC_TREEVIEW , OnGetDispInfo )
void CMyWindow:: OnItemExpanded( NMHDR* pnmh , LRESULT* pResult ) {}
其中的参数pnmh 与WM_NOTIFY中的lParam一样,pResult指向一个32位的LRESULT变量,该变量接受处理程序的返回值,例如:
*pResult = TRUE ; return;
LRESULT的定义是: typedef LONG LRESULT
16.2.3工具提示控件
class CMyToolTipCtrl:public CToolTipCtrl {
public:
BOOL AddWindowTool( CWnd* pWnd , LPCTSTR pszText ) ; }
BOOL AddWindowTool( CWnd* pWnd , LPCTSTR pszText ) {
TOOLINFO ti ; ti. cbSize = sizeof( TOOLINFO ) ; ti. uFlags = TTF_IDISHWND ; ti. hwnd = pWnd->GetParent()->GetSafeHwnd() ; ti. uId = (UINT) pWnd->GetSafeHwnd() ; ti. rect = ti. hinst = AfxGetInstanceHandle() ; ti. lpszText = (LPTSTR)pszText ;
return (BOOL) SendMessage( TTM_ADDTOOL , 0 , (LPARAM) &ti ) ; } 然后:
CMyToolTipCtrl m_ctrlTT ; m_ctrlTT.Create( this);
m_ctrlTT.AddWindowTool( pWnd , _T(“??”) ) ; ? TOOLINFO结构的定义 typedef struct tagTOOLINFO{
第49页 共 55页
《MFC Windows程序设计》读书笔记 重剑无锋 原创
UINT cbSize; UINT uFlags; HWND hwnd; UINT uId; RECT rect;
HINSTANCE hinst; LPTSTR lpszText; }TOOLINFO ;
16.4.1进度控件
样式:PBS_VERTICAL 函数: SetRange SetPos OffsetPos SetStep
SetRange32 GetPos
StepIt
GetRange
PBS_SMOOTH
第17章. 多线程和线程同步
17.1 多线程基础
17.1.1 工作者线程
工作者线程没有消息循环。 创建方式:
CWinThread* pThread = ::AFXBeginThread( 线程回调函数的名称, LPVOID pParam, 线程的优先级,
线程堆栈的大小, 线程创建后的状态, 安全属性 );
线程回调函数:
UINT ThreadFunc(VPVOID pParam);
线程内部的变量和成员数据,推荐都在堆栈上创建,这样,当线程退出时,它们会自动析构。
// 传递给线程的参数
// 默认是THREAD_PRIORITY_NORMAL // 默认值0,表示1MB大小
// 默认0,立即执行。其他CREATE_SUSPEND // 默认NULL,表示跟父线程一样
第50页 共 55页