通过WM_CTLCOLORDLG消息设置对话框的背景,当窗口过程接收消息时,wParam表示对话框的设备上下文,即HDC,lParam表示对话框的句柄。
思路:在WM_CTLCOLORDLG消息中获得对话框的大小,通过StretchBlt将位图贴到对话框的HDC中,完成对画框的背景设置,最后返回一个空画刷给系统。
注意:使用StretchBlt缩放位图时,先使用SetStretchBltMode设置内容伸展模式,避免缩放后ude位图失真。
函数:
int SetStretchBltMode ( HDC hdc; //handle to DC int iStretchMode; //bitmap stretching mode );
iStretchMode参数:
1.BLACKONWHITE or STRETCH_ANDSCANS
如果两个或多个像素要合并成一个像素,那么StretchBlt会对像素执行逻辑AND运算。结果是只有全部像素都是白色时该像素才是白色。适用于白色背景中主要是黑色的单色点阵图。
2.WHITEONBLACK or STRETCH_ORSCANS
如果两个或多个像素要合并成一个像素,那么StretchBlt会对像素执行逻辑or运算。结果是只有全部像素都是黑色时该像素才是黑色。适用于黑色背景中主要是白色的单色点阵图。
3.COLORONCOLOR or STRETCH_DELETESCANS
简单地消除像素行或列,通常是处理彩色点阵图的最佳方法。
4.HALTONE or STRETCH_HALFTONE
根据组合起来的来源颜色计算目的的平均色。
完整代码:
1 //main.cpp 2 #include <windows.h> 3 #include <tchar.h> 4 #include "resource.h" 5 6 BOOL CALLBACK DlgProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam); 7 8 int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) 9 { 10 DialogBox(hInstance,MAKEINTRESOURCE(DLG_MAIN),NULL,DlgProc); 11 return 0; 12 } 13 14 BOOL CALLBACK DlgProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) 15 { 16 RECT rcDialog; 17 HBITMAP hBitmap; 18 static BITMAP bm; 19 static HDC sthDC; 20 21 switch(uMsg) 22 { 23 case WM_INITDIALOG: 24 hBitmap=(HBITMAP)LoadImage(NULL,_T("bg.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); 25 HDC hdc; 26 hdc=GetDC(hwndDlg); 27 bm=CreateCompatibleDC(hdc); 28 SelectObject(bm,hBitmap); 29 ReleaseDC(hDlg,hdc); 30 GetObject(hBitmap,sizeof(bm),&bm); 31 return TRUE; case WM_CTLCOLORDLG: GetClientRect(hwndDlg,&rcDialog); SetStretchBltMode((HDC)wParam,COLORONCOLOR); StretchBlt((HDC)wParam,0,0,,rcDialog.right,rcDialog.bottom,sthDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY); return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH)); 32 }
时间: 2024-10-18 15:12:47