昨天学习了自绘窗口的代码编写。。
实际上就是在非客户区作图。。利用其消息响应WM_NCPAINT、WM_NCLBUTTONDOWN、WM_NCLBUTTONUP等等来重写其消息响应函数即可。。
自绘窗口二:
今天学习自绘窗口的第二种办法。
其大体思路是:去掉窗口的非客户区,实现无边框、无标题栏的窗口,然后自己来模拟绘制窗口的非客户区和客户区。
1、创建一个对话框应用程序,注意::在创建的时候不要使用Unicode库,否则在程序中,LPCTSTR与路径const char*之间有问题。。
当然使用了Unicode库,可以在路径前面加上_t()也可以。。
2、去除窗口的边框和标题栏,在OnInitDialog函数中添加代码::
DWORD
dwStyle = GetStyle();
DWORD
dwNewStyle = WS_OVERLAPPED|WS_VISIBLE|WS_SYSMENUWS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
dwNewStyle&=dwStyle;
SetWindowLong(m_hWnd,GWL_STYLE,dwNewStyle);
DWORD
dwExStyle = GetExStyle();
DWORD
dwNewExStyle = WS_EX_LEFT |WS_EX_LTRREADING |WS_EX_RIGHTSCROLLBAR;
dwNewExStyle&=dwExStyle;
SetWindowLong(m_hWnd,GWL_EXSTYLE,dwNewExStyle);
3、重新封装CImage类,采用GdiPlus。。
在StdAfx.h中静态调用diplus.lib,即由编译系统完成对DLL的加载,应用程序结束时卸载DLL的编码。如下:
#include "GdiPlus.h"
using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib")
在类的头文件中定义,以下成员变量,用来初始化GDI+的使用和结束使用。
GdiplusStartupInput m_gdiplusStartupInput;
ULONG_PTR m_gdiplusToken;
然后在InitInstance()函数中加入初始化GDI+的函数:
GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL);
在ExitInstance()函数中加入结束GDI+使用的函数: GdiplusShutdown(m_gdiplusToken);
需要画的时候
Graphics graphics(GetDC()->m_hDC);
Image image(L"Mega_GamesPack_001.png", FALSE);
graphics.DrawImage(&image, 10,10,image.GetWidth(),image.GetWidth());
4、向窗口上添加按钮,重绘CMyButtonEx继承自CButton