处理WM_NCPAINT消息
2014-01-03 18:12
211 查看
处理WM_NCPAINT消息可以实现自绘窗口边框和标题栏。
手头有个窗口需要自绘边框,于是处理了WM_NCPAINT消息,结果程序初运行时可以正常绘制,一旦最小化或者调整窗口位置后就看不到自绘的边框了。找了半天发现犯了个愚蠢的错误。在获取窗口矩形后未做处理便开始了绘图操作,现在加上平移操作,使要绘制的矩形左上角坐标归零后一切正常。
窗口包含WS_BORDER和WS_THICKFRAME风格,边框大小一般为4。
代码如下:
[csharp] view
plaincopy
if( uMsg == WM_NCPAINT )
{
HDC hdc;
hdc = GetWindowDC(hWnd);
// Paint into this DC
RECT rcWin;
GetWindowRect(hWnd, &rcWin);
OffsetRect( &rcWin, -rcWin.left, -rcWin.top );
for(int i=0; i<4; i++)
{
FrameRect(hdc, &rcWin, m_hbr[i]);
InflateRect(&rcWin, -1, -1);
}
ReleaseDC(hWnd, hdc);
return 0;
}
其中m_hbr是HBRUSH类型的数组,含4个元素,用CreateSolidBrush函数做了初始化。处理完WM_NCPAINT消息后返回0,阻止系统调用DefWindowProc继续处理。
手头有个窗口需要自绘边框,于是处理了WM_NCPAINT消息,结果程序初运行时可以正常绘制,一旦最小化或者调整窗口位置后就看不到自绘的边框了。找了半天发现犯了个愚蠢的错误。在获取窗口矩形后未做处理便开始了绘图操作,现在加上平移操作,使要绘制的矩形左上角坐标归零后一切正常。
窗口包含WS_BORDER和WS_THICKFRAME风格,边框大小一般为4。
代码如下:
[csharp] view
plaincopy
if( uMsg == WM_NCPAINT )
{
HDC hdc;
hdc = GetWindowDC(hWnd);
// Paint into this DC
RECT rcWin;
GetWindowRect(hWnd, &rcWin);
OffsetRect( &rcWin, -rcWin.left, -rcWin.top );
for(int i=0; i<4; i++)
{
FrameRect(hdc, &rcWin, m_hbr[i]);
InflateRect(&rcWin, -1, -1);
}
ReleaseDC(hWnd, hdc);
return 0;
}
其中m_hbr是HBRUSH类型的数组,含4个元素,用CreateSolidBrush函数做了初始化。处理完WM_NCPAINT消息后返回0,阻止系统调用DefWindowProc继续处理。
相关文章推荐
- 处理WM_NCPAINT消息
- 窗口绘制有关的消息整理 WM_PAINT, WM_NCPAINT, WM_ERASEBKGND
- 处理WM_NCPAINT消息
- wm_ncpaint消息
- 处理WM_CTLCOLOR消息
- WM_NCPAINT消息
- Windows消息大全
- 截获窗口消息的类(强烈推荐)
- DWR3.0+Spring2.5实现Comet服务器到浏览器的消息推送 .
- 关于无法接收消息推送问题的修改
- 基于activeMQ和protoBuffer的java消息中间件的测试
- MFC中消息机制之实现多窗体信息的传输
- 83、android的消息处理机制(图+源码分析)——Looper,Handler,Message
- php微信发送推送消息乱码
- 关于百度富文本编辑器UEditor中ctrl+enter键发送消息的解决方案
- Python消息队列
- 显示即时消息
- Windows消息投递流程:一般窗口消息投递(WM_LBUTTONCLICK)
- Openfire S2S 连接建立与消息发送
- comet 推送 消息 聊天