更新时间:2016-02-05 00:24:51浏览次数:1+次
那么整个过程,就讲解完毕了。下面是实现的效果图:
#include "windows.h"
#include <tchar.h>
TCHAR txt[]=_T("C++技术网:修改窗口背景颜色");
// - 项目是Unicode字符集
HWND hwndPa;//父窗口句柄,便于子窗口发送消息,设置为全局变量
WNDPROC wndProc;//窗口过程类型变量,用于存储窗口之前的窗口过程
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
LRESULT CALLBACK BtnProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
//按钮控件子类化的窗口过程,对按钮的一些事件进行处理
switch(message)
{
case WM_KEYDOWN:
if (wParam==VK_TAB)//子窗口将Tab键返回给父窗口
{
SendMessage(hwndPa,message,wParam,lParam);//向父窗口发送Tab键单击消息
return 0;//只将Tab键的单击消息发送给父窗口,转换为父窗口的Tab键单击
}
default:
break;//跳出到默认处理
}
return CallWindowProc(wndProc,hwnd, message, wParam, lParam);//调用按钮控件的窗口过程,这样就支持按钮的各种特性
}
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static HWND hChild1,hChild2,hChild3;
static int i=-1;
switch (message)
{
case WM_CREATE:
hChild1 = CreateWindow(_T("button"),_T("1"),WS_CHILD|WS_VISIBLE,0,0,100,50,hwnd,(HMENU)1,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),0);
hChild2 = CreateWindow(_T("button"),_T("2"),WS_CHILD|WS_VISIBLE,0,50,100,50,hwnd,(HMENU)2,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),0);
hChild3 = CreateWindow(_T("button"),_T("3"),WS_CHILD|WS_VISIBLE,0,100,100,50,hwnd,(HMENU)3,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),0);
wndProc = (WNDPROC)SetWindowLong(hChild1,GWL_WNDPROC,(LONG)BtnProc);//子类化按钮1,得到按钮的原先系统的按钮窗口过程
SetWindowLong(hChild2,GWL_WNDPROC,(LONG)BtnProc);//子类化按钮2,与按钮1的的按钮窗口过程一样的,所以不需要再获取了
SetWindowLong(hChild3,GWL_WNDPROC,(LONG)BtnProc);//子类化按钮3,与按钮1的的按钮窗口过程一样的,所以不需要再获取了
break;
case WM_KEYDOWN://父窗口统一处理Tab键,不管焦点在不在父窗口,父窗口都可以处理了。
if (wParam==VK_TAB)
{
if(i%4==0)//父窗口得到焦点
{
SetFocus(hwnd);
}
else if(i%4==1)//按钮1得到焦点
{
SetFocus(hChild1);
}
else if(i%4==2)//按钮2得到焦点
{
SetFocus(hChild2);
}
else if(i%4==3)//按钮3得到焦点
{
SetFocus(hChild3);
}
i++;
}
break;
case WM_COMMAND:
{
//单击按钮将焦点设置到按钮上
SetFocus((HWND)lParam);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
break;//跳出到默认处理
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrev,LPSTR lpCmd,int iShow)
{
TCHAR ClassName[] = _T("MyClass");
TCHAR title1[] = _T("C++技术网http://www.cjjjs.com");
WNDCLASS wndClass;
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndClass.hInstance = hInstance;
wndClass.lpfnWndProc = WinProc;
wndClass.lpszClassName = ClassName;
wndClass.lpszMenuName=NULL;
wndClass.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
if(!RegisterClass(&wndClass))return 0;
hwndPa = CreateWindow(ClassName,title1,WS_OVERLAPPEDWINDOW,10,100,600,400,NULL,NULL,hInstance,NULL);
ShowWindow(hwndPa,SW_SHOWNORMAL);
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
相关资讯