很多人都做自绘菜单,修改菜单flag为MF_OWNERDRAW,重载DrawItem和MeasureItem即可实现,这里不再赘述。可是菜单原有的边框在自绘后无法去掉,并且和菜单自绘后的背景图案不一定协调。这里介绍一下去掉菜单边框的方法。
菜单其实也是一种窗口,是类名为“#32768”的窗口,我们可以通过钩子截取窗口过程,对相应的消息进行处理,需要注意的是,菜单窗口不是通过WM_PAINT和WM_NCPAINT对窗口进行绘制,而是通过WM_PRINT(整个窗口)和WM_PRINTCLIENT(客户区)进行绘制。下面介绍具体实现的过程:
首先要创建一个进程内钩子,一般在App的InitInstance里调用
::SetWindowsHookEx (WH_CALLWNDPROC, WindowsHook, m_hInstance, ::GetCurrentThreadId());
在钩子函数里替换窗口过程函数
WNDPROC oldWndProc = NULL;
RESULT CALLBACK CMenuOwnerDraw::WindowsHook (int code, WPARAM wParam, LPARAM lParam)
{
CWPSTRUCT* pStruct = (CWPSTRUCT*)lParam;
while ( code == HC_ACTION )
{
HWND hWnd = pStruct->hwnd;
//捕捉菜单创建WM_CREATE, 0x01E2是什么消息我不