给 OnPaint 加个 HDC 参数

原创 2014年12月12日 19:23:45
MFC的窗口绘制函数是
CWnd::OnPaint  
afx_msg void OnPaint( );


而 WM_PAINT 消息可以是


WM_PAINT 
hdc = (HDC) wParam;


就是说OnPaint可以带个 HDC 的参数.
// in head file
// afx_msg void OnPaint();
afx_msg void OnMyPaint(WPARAM wParam, LPARAM lParam);


// in cpp file
// ON_WM_PAINT()
ON_MESSAGE(WM_PAINT, OnMyPaint)
//
//Replace OnPaint()
void CScrollBitmapDlg::OnMyPaint(WPARAM wParam, LPARAM lParam)
{
    if(wParam)
    {// paint to memDC
         CDC *pDC=CDC::FromHandle((HDC)wParam);
         pDC->BitBlt(m_rcPicture.left,m_rcPicture.top,m_rcPicture.Width(),
m_rcPicture.Height(),&m_dcMem, m_Sourcex, m_Sourcey,SRCCOPY);
     }
...
}
使用方法
void CScrollBitmapDlg::CopyPictures(HWND hWnd,CPoint point) 
{// TODO: Add your message handler code here
UINT ID=::GetDlgCtrlID(hWnd);
// afxDump << ID << " ID\n";
// size
CRect rc;
if(hWnd==0)
{
ID=0;
GetWindowRect(&rc);// the dialog
}
else
{
::GetWindowRect(hWnd,&rc);
}
// create dc
CClientDC dc(this);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
// create empty bmp
HBITMAP bmp=CreateCompatibleBitmap(dc /* not dcMem */, rc.Width(),rc.Height());
dcMem.SelectObject(bmp);
//
CString prompt;
switch (ID)
{
case IDOK:// "Exit"
m_Ok.SendMessage(WM_PAINT,(WPARAM)dcMem.m_hDC,0);
prompt="\"Exit\" button has been copied to clipbroad!";
break;
case IDC_SCROLLBAR1:// "H bar"
m_hBar.SendMessage(WM_PAINT,(WPARAM)dcMem.m_hDC,0);
prompt="\"Horizontal\" scrollbar has been copied to clipbroad!";
break;
case IDC_SCROLLBAR2:// "V bar"
m_vBar.SendMessage(WM_PAINT,(WPARAM)dcMem.m_hDC,0);
prompt="\"Vertical\" scrollbar has been copied to clipbroad!";
break;
case IDC_SHOW:// "Open"
m_Open.SendMessage(WM_PAINT,(WPARAM)dcMem.m_hDC,0);
prompt="\"Open\" button has been copied to clipbroad!";
break;
case IDC_PICTURE:// m_Pic
OnMyPaint((WPARAM)dcMem.m_hDC,0);
prompt="\"CStatic Picture\" has been copied to clipbroad!";
break;
case 0:// the dialog
this->SendMessage(WM_PRINT,(WPARAM)dcMem.m_hDC,
(LPARAM)(PRF_NONCLIENT | PRF_CHILDREN | PRF_CLIENT | 


PRF_ERASEBKGND | PRF_OWNED));
prompt="\"The whole dialog\" has been copied to clipbroad!";
break;
}
// move bmp to clipboard
CBitmap *pbmp=dcMem.GetCurrentBitmap();
OpenClipboard();
EmptyClipboard();
SetClipboardData(CF_BITMAP,pbmp->GetSafeHandle());
    CloseClipboard();
//
DeleteObject(bmp);
//
AfxMessageBox(prompt);
}

关于OnPaint函数的工作原理(很详细,很实用)

用了两年的VC,其实对OnPaint的工作原理一直都是一知半解。这两天心血来潮,到BBS上到处发帖询问,总算搞清楚了,现在总结一下。      对于窗口程序,一般有个特点:窗口大部分的区域保持不...
  • foreverhuylee
  • foreverhuylee
  • 2014年03月23日 21:46
  • 8711

MFC中onPaint()函数的使用

MFC中onPaint()函数的使用 WM_PAINT是窗口每次重绘都会产生的一个消息。 OnPaint是对这个消息的反应函数 mfc 的 CWnd::OnPaint 没做什么,只...
  • ximi19881011
  • ximi19881011
  • 2014年05月04日 00:02
  • 5734

对话框的OnPaint()和OnEraseBkgnd()消息的理解

一个对话框重写OnPaint()和OnEraseBkgnd()
  • ximi19881011
  • ximi19881011
  • 2014年04月07日 19:42
  • 1436

Jekyll: 给博客加个随机BGM

文章最初发布于 szhshp的第三边境研究所 , 转载请注明 捡了个蓝牙耳机,这几天基本保持“自带BGM”的状态o( ̄▽ ̄)o ……很早实现了Jekyll-全局BGM1 一定要通过主页才...
  • szhielelp
  • szhielelp
  • 2017年04月23日 21:12
  • 280

宏定义里为什么要加个do..while(0)

#define MACRO_NAME(para) do{macro content}while(0) 的格式,总结了以下几个原因: 1,空的宏定义避免warning: #define foo...
  • zcainiao
  • zcainiao
  • 2013年08月26日 14:07
  • 419

POJ-2184(背包 + 动态数组,给交流电加个直流偏执)

这道题WA了N次终于A了,看了Discuss也
  • uuuououlcz
  • uuuououlcz
  • 2014年07月20日 23:30
  • 418

【转】绘制_OnPaint和OnEraseBkgnd的联系

  • 2011年07月10日 09:50
  • 104KB
  • 下载

OnDraw与OnPaint有什么区别

  • 2012年03月10日 22:19
  • 6KB
  • 下载

Png OnPaint Error

  • 2014年04月10日 15:13
  • 347KB
  • 下载

OnPaint()与OnDraw()的区别

  • 2012年07月31日 09:27
  • 17KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:给 OnPaint 加个 HDC 参数
举报原因:
原因补充:

(最多只允许输入30个字)