下面这个程序,在单击每个按钮时,该按钮会向其父窗口发送WM_COMMAND消息,这个窗口过程就是我们所熟悉的WindowProc,函数将在客户区的右侧显示这个消息的wParam和lParam参数
创建子窗口的参数如下
类名 |
TEXT("button") |
窗口文本 |
button[i].szText |
窗口样式 |
WS_CHILD|WS_VISIBLE|button[i].iStyle |
X坐标 |
cxChar |
Y坐标 |
cyChar*(1+2*i) |
宽度 |
20*xChar |
高度 |
7*yChar/4 |
父窗口 |
hwnd |
子窗口ID |
(HMUNE)i |
案例句柄 |
((LPCREATESTRUCT)lParam)->hInstance |
额外参数 |
NULL |
其中案例句柄可以声明一个全局变量(HINSTANCE hInst;),然后在WinMain赋值 hInst=hInstance;
列表框,按钮控件,编辑控件相应的wParam,lParam变量的含义是一样的
LOWORD(wParam) |
子窗口ID |
HIWORD(wParam) |
通知码 |
lParam |
子窗口 |
在后面的博客中,会多次出现
cxClient=LOWORD(lParam);
switch (LOWORD (wParam))//低位wParam获取通知码
{
case SB_PAGEDOWN :
......
case WM_VSCROLL :
i = GetWindowLong ((HWND) lParam, GWL_ID) ;
switch (LOWORD (wParam))//低位wParam获取通知码
{
case SB_PAGEDOWN :
color[i] += 15 ;
switch (message)//确定焦点,实现用tab键来转换焦点
{
case WM_KEYDOWN :
if (wParam == VK_TAB)
SetFocus (GetDlgItem (GetParent (hwnd),
诸如此类的东西,大家要弄明白wParam,lParam参数在不同的环境,所代表的意义。
看完整程序:
#include<windows.h>
struct{
int iStyle;
TCHAR * szText;
}
button[]={
BS_PUSHBUTTON ,TEXT("PUSHBUTTON"),
BS_DEFPUSHBUTTON,TEXT("DEFPUSHBUTTON"),
BS_CHECKBOX,TEXT("CHECKBOX"),
BS_AUTOCHECKBOX,TEXT("AUTOCHECKBOX"),
BS_RADIOBUTTON,TEXT("RADIOBUTTON"),
BS_3STATE,TEXT("3STATE"),
BS_AUTO3STATE,TEXT("AUTO3STATE"),
BS_GROUPBOX,TEXT("GROUPBOX"),
BS_OWNERDRAW,TEXT("OWNERDRAW")
};
#define NUM (sizeof(button)/sizeof(button[0]))
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
static TCHAR szAppName[]=TEXT("leidemingzi");
HWND hwnd;
MSG msg;
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_ERROR);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WindowProc;
wndclass.lpszClassName=szAppName;
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("the program require window nt"),TEXT("TIPS"),MB_ICONERROR);
return 0;
}
hwnd=CreateWindow(
szAppName, // registered class name
TEXT("this is title"), // window name
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // horizontal position of window
CW_USEDEFAULT, // vertical position of window
CW_USEDEFAULT, // window width
CW_USEDEFAULT, // window height
NULL, // handle to parent or owner window
NULL, // menu handle or child identifier
hInstance, // handle to application instance
NULL // window-creation data
);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WindowProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hwndButton[NUM] ;
static RECT rect ;
static TCHAR szTop[] = TEXT ("message wParam lParam"),
szUnd[] = TEXT ("_______ ______ ______"),
szFormat[] = TEXT ("%-16s%04X-%04X %04X-%04X"),
szBuffer[50] ;
static int cxChar, cyChar ;
HDC hdc ;
PAINTSTRUCT ps ;
int i ;
switch (message)
{
case WM_CREATE :
cxChar = LOWORD (GetDialogBaseUnits ()) ;
cyChar = HIWORD (GetDialogBaseUnits ()) ;
for (i = 0 ; i < NUM ; i++)
hwndButton[i] = CreateWindow ( TEXT("button"),
button[i].szText,
WS_CHILD | WS_VISIBLE | button[i].iStyle,
cxChar, cyChar * (1 + 2 * i),
20 * cxChar, 7 * cyChar / 4,
hwnd, (HMENU) i,
((LPCREATESTRUCT) lParam)->hInstance, NULL) ;
return 0 ;
case WM_SIZE :
rect.left = 24 * cxChar ;
rect.top = 2 * cyChar ;
rect.right = LOWORD (lParam) ;
rect.bottom = HIWORD (lParam) ;
return 0 ;
case WM_PAINT :
InvalidateRect (hwnd, &rect, TRUE) ;
hdc = BeginPaint (hwnd, &ps) ;
SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
SetBkMode (hdc, TRANSPARENT) ;
TextOut (hdc, 24 * cxChar, cyChar, szTop, lstrlen (szTop)) ;
TextOut (hdc, 24 * cxChar, cyChar, szUnd, lstrlen (szUnd)) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DRAWITEM :
case WM_COMMAND :
ScrollWindow (hwnd, 0, -cyChar, &rect, &rect) ;
hdc = GetDC (hwnd) ;
SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
TextOut (hdc, 24 * cxChar, cyChar * (rect.bottom / cyChar - 1),
szBuffer,
wsprintf (szBuffer, szFormat,
message == WM_DRAWITEM ? TEXT ("WM_DRAWITEM") :
TEXT ("WM_COMMAND"),
HIWORD (wParam), LOWORD (wParam),
HIWORD (lParam), LOWORD (lParam))) ;
ReleaseDC (hwnd, hdc) ;
ValidateRect (hwnd, &rect) ;
break ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
看看效果图:
分享到:
相关推荐
qt的子窗口控件使用实例,运行环境是QT5,供大家参考使用
该程序可遍历当前打开的所有窗口,以及每个窗口的子控件,显示出窗口名字,子控件名字及类型,使用VC++开发
asm_09子窗口控件
8.如何在程序窗口中创建按钮控件?(Visual C++编程 源代码)8.如何在程序窗口中创建按钮控件?(Visual C++编程 源代码)8.如何在程序窗口中创建按钮控件?(Visual C++编程 源代码)8.如何在程序窗口中创建按钮...
C#中父窗口和子窗口之间实现控件互操作C#中父窗口和子窗口之间实现控件互操作
此工程实现了MFC窗口控件随窗口大小进行自适应,封装了WidgetResize类用来调整控件大小位置,非常好用。
旋转按钮控件旋转按钮控件旋转按钮控件旋转按钮控件
C# 自定义按钮控件C# 自定义按钮控件C# 自定义按钮控件C# 自定义按钮控件C# 自定义按钮控件C# 自定义按钮控件C# 自定义按钮控件C# 自定义按钮控件C# 自定义按钮控件C# 自定义按钮控件C# 自定义按钮控件C# 自定义按钮...
C# WPF MDI 窗口控件互操作,用的是System.Windows.Window窗口,并非Form。从主窗口打开子窗口,子窗口上的WPF控件控制主窗口上的控件。极为简单易学的例子程序。适用于WPF初学者。
c#编程的时候,有时候会用到在当前窗口里面修改了一些参数的时候,希望另外一个窗口控件属性得到刷新更改. 本程序通过简单的代码,实现了此功能,希望能使更多和我一样的C#编程爱好者更好地学会学好C#. 如果您有好的...
WPF中仅通过XAML代码来实现点击按钮隐藏其他控件,源码
7.1.1 子窗口控件运行原理
里面有关于按钮和父子窗口的知识点,希望对大家有用
c#实现圆形按钮控件
vb-EnumChildWindows所有窗口及子窗口句柄是一款vb枚举窗口枚举出所有父窗口和其对应的子窗口句柄信息获取查看工具,每个子窗口控件都具有一个在其兄弟中唯一的窗口句柄和ID值。对于句柄和ID这两者,知道其中的一个...
VC 动态隐藏窗口中的按钮、文本框等控件,本例中是把窗口中的TextBox文本框控件隐藏,点击按钮后即可隐藏该控件。整个代码的执行,在用户点击了按钮后,触发按钮事件,在按钮事件中,写入以下代码即可: void ...
vc++ MFC 界面设计编程 各种控件设计,包括树控件,视图控件,静态文本,按钮控件,旋转控件,组合狂,tab控件等等,欢迎下载啊。(树控件)
JCButton按钮控件正式版JCButton按钮控件正式版JCButton按钮控件正式版JCButton按钮控件正式版
一个好用的VB按钮控件 一个好用的VB按钮控件 一个好用的VB按钮控件