1.WM_CTLCOLORDLG消息
在对话框画出来之前,系统将该消息发给对话框窗口。通过WM_CTLCOLORDLG消息来设置对话框文本和背景。
当窗口处理函数处理这个消息时,wParam表示对话框设备上下文(HDC),lParam表示对话框句柄。
如果处理了这个消息,返回一个画刷,系统用这个画刷重绘对话框背景。
因此,在WM_CTLCOLORDLG消息中获得对话框的大小,通过StretchBlt函数将位图缩放后放到对话框中,就完成了背景设置。
并且,要返回一个空画刷给系统,系统才不会将位图背景覆盖。
在使用StretchBlt函数前,最好先用SetStretchBltMode函数来设置位图内容伸展模式,避免位图缩放后失真严重。
int SetStretchBltMode( HDC hdc, int iStretchMode);
伸展模式:
BLACKONWHITE / STRETCH_ANDSCANS
如果两个或多个像素得合成一个像素,那么StretchBlt会对像素执行一个逻辑and运算。只有全部的原始像素是白色时,该像素
才是白色,其实际意义是黑色像素控制了白色像素,适用于白色背景中是黑色的单色点阵图。
WHITEONBLACK / STRETCH_ORSCANS
如果两个或多个像素得合成一个像素,那么StretchBlt会对像素执行一个逻辑or运算。只有全部的原始像素是黑色时,该像素才
是黑色,也就是说白色像素决定颜色,适用于黑色背景中白色的单色点阵图。
COLORONCOLOR / STRETCH_DELETESCANS
简单地消除图素行或列,而没有任何逻辑组合。通常是处理彩色点阵图的最佳方法。
HALFONE / STRTCH_HALFONE
根据组合起来的源颜色计算目的的平均颜色。
CONST WCHAR szDlgTitle[] = L"位图背景"; BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { RECT rcDialog; HBITMAP hBitmap; static BITMAP s_bm; static HDC s_hdcMem; switch (message) { case WM_SIZE: InvalidateRect(hDlg, NULL, TRUE); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL: DeleteDC(s_hdcMem); EndDialog(hDlg, LOWORD(wParam)); return TRUE; } break; case WM_INITDIALOG: SetWindowText(hDlg, szDlgTitle); SetWindowLong(hDlg, GWL_STYLE, GetWindowLong(hDlg, GWL_STYLE) | WS_SIZEBOX); //加载背影图片 hBitmap = (HBITMAP)LoadImage(NULL, L"mn.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); if (hBitmap == NULL) { MessageBox(hDlg, L"LoadImage failed", L"Error", MB_ICONERROR); exit(0); } //将背影图片放入s_hdcMem HDC hdc; hdc = GetDC(hDlg); s_hdcMem = CreateCompatibleDC(hdc); SelectObject(s_hdcMem, hBitmap); ReleaseDC(hDlg, hdc); //得到位图信息 GetObject(hBitmap, sizeof(s_bm), &s_bm); return TRUE; case WM_CTLCOLORDLG: GetClientRect(hDlg, &rcDialog); //通过SetStretchBltMode的设置能使StretchBlt在缩放图像更加清晰 SetStretchBltMode((HDC)wParam, COLORONCOLOR); StretchBlt((HDC)wParam, 0, 0, rcDialog.right, rcDialog.bottom, s_hdcMem, 0, 0, s_bm.bmWidth, s_bm.bmHeight, SRCCOPY); return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH)); } return FALSE; } int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc); return 0; }