1.位图背景与位图画刷

Posted 不忘初心 方得始终

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.位图背景与位图画刷的主要内容,如果未能解决你的问题,请参考以下文章

vc中如何让背景图片随窗体的大小变化而改变 mfc

MFC给对话框设置统一风格背景图,wince 6.0应用程序

WPF学习第四十四章 图画

将位图从片段保存到内部/外部存储[关闭]

WPF学习第四十四章 图画

WPF学习第四十四章 图画