首页 > 代码库 > 1.位图背景与位图画刷

1.位图背景与位图画刷

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;}

  技术分享

1.位图背景与位图画刷