挑战CSDN所有牛人,送200分,子窗口得不到键盘消息,SDK,//高手帮我哦,全SDK,可我写的这个代码子窗口得不到键盘消息
/*
高手帮我哦,全SDK,
hwnd1是hwnd2 的母窗口,
回调函数:hwnd1 (WndProc1),hwnd2 (WndProc2)
子窗口HWND2只能得到鼠标消息,键盘消息得不到,
而且也显示不了WM_PAINT中要显示的“22222”,
*/
#include "stdafx.h"
#include "stdio.h"
HINSTANCE hinst;LRESULT CALLBACK WndProc1(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if(msg==WM_DESTROY)
{ PostQuitMessage(0);return 0;}
if(msg==WM_KEYDOWN||msg==WM_LBUTTONDOWN)
{MessageBox(hwnd,"1111111111111111","1111111111111",MB_OK);}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
LRESULT CALLBACK WndProc2(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if(msg==WM_DESTROY)
{ PostQuitMessage(0);return 0;}
if(msg==WM_KEYDOWN||msg==WM_LBUTTONDOWN)
{MessageBox(hwnd,"2222222222222","22222222222222",MB_OK);}
if(msg==WM_PAINT)
{
PAINTSTRUCT ps;HDC hdc;
BeginPaint(hwnd,&ps);
char * str="22222222222";
TextOut(hdc,0,0,str,strlen(str));
EndPaint(hwnd,&ps); }
int n=DefWindowProc(hwnd, msg, wParam, lParam);
return n;
}
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndProc2(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
hinst = hInstance;
MSG msg;
WNDCLASSEX wcex1;
wcex1.cbSize = sizeof(WNDCLASSEX);
wcex1.style = CS_HREDRAW | CS_VREDRAW;
wcex1.lpfnWndProc = (WNDPROC)WndProc1;
wcex1.cbClsExtra = 0;
wcex1.cbWndExtra = 0;
wcex1.hInstance = hInstance;
wcex1.hIcon = NULL;//LoadIcon(hInstance, (LPCTSTR)IDI_WINSAMPLE1);
wcex1.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex1.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex1.lpszMenuName = NULL;//(LPCSTR)IDC_WINSAMPLE1;
wcex1.lpszClassName = "winsample";
wcex1.hIconSm = NULL;//LoadIcon(wcex1.hInstance, (LPCTSTR)IDI_SMALL);
RegisterClassEx(&wcex1);
HWND hwnd=CreateWindow("winsample", "winsample", WS_OVERLAPPEDWINDOW,
0,0,800,600,
//CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
WNDCLASSEX wcex2;
wcex2.cbSize = sizeof(WNDCLASSEX);
wcex2.style = CS_HREDRAW | CS_VREDRAW;
wcex2.lpfnWndProc = (WNDPROC)WndProc2;
wcex2.cbClsExtra = 0;
wcex2.cbWndExtra = 0;
wcex2.hInstance = hInstance;
wcex2.hIcon = NULL;//LoadIcon(hInstance, (LPCTSTR)IDI_WINSAMPLE1);
wcex2.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex2.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex2.lpszMenuName = NULL;//(LPCSTR)IDC_WINSAMPLE1;
wcex2.lpszClassName = "win2";
wcex2.hIconSm = NULL;//LoadIcon(wcex2.hInstance, (LPCTSTR)IDI_SMALL);
RegisterClassEx(&wcex2);
//HWND hwnd2=CreateWindow("win2", "win2", WS_CHILDWINDOW|WS_VISIBLE, \
//CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, \
0,0,50,50,\
hwnd, NULL, hInstance, NULL);
HWND hwnd2=CreateWindowEx(WS_EX_CLIENTEDGE,"win2", "win2", WS_CHILDWINDOW|WS_VISIBLE,
0,0,50,50,
hwnd, NULL, hInstance, NULL);
ShowWindow(hwnd2, nCmdShow);
UpdateWindow(hwnd2); while (GetMessage(&msg, NULL, 0, 0))
{
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} return msg.wParam;
}
/*
高手帮我哦,全SDK,
hwnd1是hwnd2 的母窗口,
回调函数:hwnd1 (WndProc1),hwnd2 (WndProc2)
子窗口HWND2只能得到鼠标消息,键盘消息得不到,
而且也显示不了WM_PAINT中要显示的“22222”,
*/
#include "stdafx.h"
#include "stdio.h"
HINSTANCE hinst;LRESULT CALLBACK WndProc1(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if(msg==WM_DESTROY)
{ PostQuitMessage(0);return 0;}
if(msg==WM_KEYDOWN||msg==WM_LBUTTONDOWN)
{MessageBox(hwnd,"1111111111111111","1111111111111",MB_OK);}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
LRESULT CALLBACK WndProc2(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if(msg==WM_DESTROY)
{ PostQuitMessage(0);return 0;}
if(msg==WM_KEYDOWN||msg==WM_LBUTTONDOWN)
{MessageBox(hwnd,"2222222222222","22222222222222",MB_OK);}
if(msg==WM_PAINT)
{
PAINTSTRUCT ps;HDC hdc;
BeginPaint(hwnd,&ps);
char * str="22222222222";
TextOut(hdc,0,0,str,strlen(str));
EndPaint(hwnd,&ps); }
int n=DefWindowProc(hwnd, msg, wParam, lParam);
return n;
}
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndProc2(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
hinst = hInstance;
MSG msg;
WNDCLASSEX wcex1;
wcex1.cbSize = sizeof(WNDCLASSEX);
wcex1.style = CS_HREDRAW | CS_VREDRAW;
wcex1.lpfnWndProc = (WNDPROC)WndProc1;
wcex1.cbClsExtra = 0;
wcex1.cbWndExtra = 0;
wcex1.hInstance = hInstance;
wcex1.hIcon = NULL;//LoadIcon(hInstance, (LPCTSTR)IDI_WINSAMPLE1);
wcex1.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex1.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex1.lpszMenuName = NULL;//(LPCSTR)IDC_WINSAMPLE1;
wcex1.lpszClassName = "winsample";
wcex1.hIconSm = NULL;//LoadIcon(wcex1.hInstance, (LPCTSTR)IDI_SMALL);
RegisterClassEx(&wcex1);
HWND hwnd=CreateWindow("winsample", "winsample", WS_OVERLAPPEDWINDOW,
0,0,800,600,
//CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
WNDCLASSEX wcex2;
wcex2.cbSize = sizeof(WNDCLASSEX);
wcex2.style = CS_HREDRAW | CS_VREDRAW;
wcex2.lpfnWndProc = (WNDPROC)WndProc2;
wcex2.cbClsExtra = 0;
wcex2.cbWndExtra = 0;
wcex2.hInstance = hInstance;
wcex2.hIcon = NULL;//LoadIcon(hInstance, (LPCTSTR)IDI_WINSAMPLE1);
wcex2.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex2.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex2.lpszMenuName = NULL;//(LPCSTR)IDC_WINSAMPLE1;
wcex2.lpszClassName = "win2";
wcex2.hIconSm = NULL;//LoadIcon(wcex2.hInstance, (LPCTSTR)IDI_SMALL);
RegisterClassEx(&wcex2);
//HWND hwnd2=CreateWindow("win2", "win2", WS_CHILDWINDOW|WS_VISIBLE, \
//CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, \
0,0,50,50,\
hwnd, NULL, hInstance, NULL);
HWND hwnd2=CreateWindowEx(WS_EX_CLIENTEDGE,"win2", "win2", WS_CHILDWINDOW|WS_VISIBLE,
0,0,50,50,
hwnd, NULL, hInstance, NULL);
ShowWindow(hwnd2, nCmdShow);
UpdateWindow(hwnd2); while (GetMessage(&msg, NULL, 0, 0))
{
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} return msg.wParam;
}
解决方案 »
- 谁有Visual C++ 2005入门经典电子书?
- 向Vista Icon进军!
- 关于对话框DestroyWindow()的问题??
- 有没有可能像打开文件一样打开文件夹?
- 有能语法分析HTML的标记和内容的类吗?
- activex中函数参数为LPDISPATCH类型,我想传递一个Dialog,如何实现
- 请问在vc中文件读写的具体过程
- 为什么VS2010无法创建VC++项目,其他项目可以创建,急急急!!!
- 字符串
- 我不喜欢平均,先来有分!!
- 高分菜鸟问题:2个combo box和2组radio,如何设置变量并且将其打印出来(内详)
- 请问在CDialog中如何修改菜单为已钩选?(就是旁边打个小钩的那种)
方法是:要有激活,就是鼠标点击hwnd2的时候,告诉主窗口现在由子窗口接收键盘消息,主窗口在收到键盘消息的时候,转发给子窗口:SendMessage(hwnd, ...)。另外,需要提供一种方式让用户知道现在获得输入焦点的是你的控件,比如虚线框,或者输入光标。
不过MS EDIT究竟用的什么技术 只简单的CREATEWINDOW 后就行了。
我想可能关键在于WINDOW STYLE的设置上,不过试过后还是不行……
WndProc2函数的WM_PAINT消息,必须
hdc = BeginPaint(hwnd,&ps);
2.hwnd2不能接收键盘消息的问题
在UpdateWindow(hwnd2)之后加SetFocus(hwnd2);
但是你的代码只能接收一次键盘输入,原因是接收输入后弹出MessageBox,当确定了MessageBox后,系统将hwnd1活动,但是hwnd1没有再次使hwnd2成为焦点。可以这样测试:将MessageBox替换为TextOut,
如下:
char str[20];
if(msg == WM_KEYDOWN)
sprintf(str,"KeyDown:%c",wParam);
else
sprintf(str,"LbuttonDown");
HDC hdc = GetDC(hwnd);
TextOut(hdc,0,0,str,lstrlen(str));
ReleaseDC(hwnd,hdc);
你可以看到hwnd2一直相应键盘和鼠标消息.
另外,强烈建议楼主的代码写的规范些,第一个问题恐怕就是糟糕的排版造成的疏忽
子窗口不能显示字符是因为HWND1屏蔽了HWND2,MS EDIT不知道怎么做到的反屏蔽。
可能要设置窗口特殊的STYLE.另外如何让子窗口被点一下后就可以获得输入焦点呢?
而且还不用显式调用SETFOCUS(子窗口HWND);比如MS EDIT就没有。
perhaps set hwnd's style or styleex to some var cetain,then all ok.改成这样,
在UpdateWindow(hwnd2)之后加SetFocus(hwnd2);#include "stdafx.h"
#include "stdio.h"
HINSTANCE hinst;LRESULT CALLBACK WndProc1(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if(msg==WM_DESTROY)
{ PostQuitMessage(0);return 0;}
if(msg==WM_KEYDOWN||msg==WM_LBUTTONDOWN)
{MessageBox(hwnd,"1111111111111111","1111111111111",MB_OK);}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
LRESULT CALLBACK WndProc2(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if(msg==WM_DESTROY)
{ PostQuitMessage(0);return 0;}
//if(msg==WM_KEYDOWN||msg==WM_LBUTTONDOWN){MessageBox(hwnd,"2222222222222","22222222222222",MB_OK);}
if(msg==WM_KEYDOWN||msg==WM_LBUTTONDOWN)
{
char * str="2222222";
HDC hdc = GetDC(hwnd);
TextOut(hdc,0,0,str,strlen(str));
ReleaseDC(hwnd,hdc);
return 0;
}; if(msg==WM_PAINT)
{
PAINTSTRUCT ps;HDC hdc;
BeginPaint(hwnd,&ps);
char * str="22222222222";
TextOut(hdc,0,0,str,strlen(str));
EndPaint(hwnd,&ps);
}
int n=DefWindowProc(hwnd, msg, wParam, lParam);
return n;
}
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndProc2(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
hinst = hInstance;
MSG msg;
WNDCLASSEX wcex1;
wcex1.cbSize = sizeof(WNDCLASSEX);
wcex1.style = CS_HREDRAW | CS_VREDRAW;
wcex1.lpfnWndProc = (WNDPROC)WndProc1;
wcex1.cbClsExtra = 0;
wcex1.cbWndExtra = 0;
wcex1.hInstance = hInstance;
wcex1.hIcon = NULL;//LoadIcon(hInstance, (LPCTSTR)IDI_WINSAMPLE1);
wcex1.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex1.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex1.lpszMenuName = NULL;//(LPCSTR)IDC_WINSAMPLE1;
wcex1.lpszClassName = "winsample";
wcex1.hIconSm = NULL;//LoadIcon(wcex1.hInstance, (LPCTSTR)IDI_SMALL);
RegisterClassEx(&wcex1);
HWND hwnd=CreateWindow("winsample", "winsample", WS_OVERLAPPEDWINDOW,
0,0,800,600,
//CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
WNDCLASSEX wcex2;
wcex2.cbSize = sizeof(WNDCLASSEX);
wcex2.style = CS_HREDRAW | CS_VREDRAW;
wcex2.lpfnWndProc = (WNDPROC)WndProc2;
wcex2.cbClsExtra = 0;
wcex2.cbWndExtra = 0;
wcex2.hInstance = hInstance;
wcex2.hIcon = NULL;//LoadIcon(hInstance, (LPCTSTR)IDI_WINSAMPLE1);
wcex2.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex2.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex2.lpszMenuName = NULL;//(LPCSTR)IDC_WINSAMPLE1;
wcex2.lpszClassName = "win2";
wcex2.hIconSm = NULL;//LoadIcon(wcex2.hInstance, (LPCTSTR)IDI_SMALL);
RegisterClassEx(&wcex2);
//HWND hwnd2=CreateWindow("win2", "win2", WS_CHILDWINDOW|WS_VISIBLE, \
//CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, \
0,0,50,50,\
hwnd, NULL, hInstance, NULL);
HWND hwnd2=CreateWindowEx(WS_EX_CLIENTEDGE,"win2", "win2", WS_CHILDWINDOW|WS_VISIBLE,
0,0,50,50,
hwnd, NULL, hInstance, NULL);
ShowWindow(hwnd2, nCmdShow);
UpdateWindow(hwnd2);
SetFocus(hwnd2); while (GetMessage(&msg, NULL, 0, 0))
{
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} return msg.wParam;
}
2。为什么1111得不到键盘? 关键是MessageBox() 返回又导致焦点没有了
3。不是没有得到焦点,而已看不见而已,如 Mackz(在相互) 所说:绘制 虚线 什么的 让人可以看出来
4 。你的代码有点不规范
5。 在你的代码里加一句话就可以了
代码如下:
#include "windows.h"
#include "stdio.h"
HINSTANCE hinst;LRESULT CALLBACK WndProc1(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if(msg==WM_DESTROY)
{ PostQuitMessage(0);return 0;}
if(msg==WM_KEYDOWN||msg==WM_LBUTTONDOWN)
{MessageBox(hwnd,"1111111111111111","1111111111111",MB_OK);}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
LRESULT CALLBACK WndProc2(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if(msg==WM_DESTROY)
{ PostQuitMessage(0);return 0;}
if(msg==WM_KEYDOWN||msg==WM_LBUTTONDOWN)
{MessageBox(hwnd,"2222222222222","22222222222222",MB_OK);
SetFocus(hwnd); //在这加一句~注意只加了这一句 头文件被我改了,你可以改回去可了~
}
if(msg==WM_PAINT)
{
PAINTSTRUCT ps;HDC hdc;
BeginPaint(hwnd,&ps);
char * str="22222222222";
TextOut(hdc,0,0,str,strlen(str));
EndPaint(hwnd,&ps); }
int n=DefWindowProc(hwnd, msg, wParam, lParam);
return n;
}
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndProc2(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
hinst = hInstance;
MSG msg;
WNDCLASSEX wcex1;
wcex1.cbSize = sizeof(WNDCLASSEX);
wcex1.style = CS_HREDRAW | CS_VREDRAW;
wcex1.lpfnWndProc = (WNDPROC)WndProc1;
wcex1.cbClsExtra = 0;
wcex1.cbWndExtra = 0;
wcex1.hInstance = hInstance;
wcex1.hIcon = NULL;//LoadIcon(hInstance, (LPCTSTR)IDI_WINSAMPLE1);
wcex1.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex1.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex1.lpszMenuName = NULL;//(LPCSTR)IDC_WINSAMPLE1;
wcex1.lpszClassName = "winsample";
wcex1.hIconSm = NULL;//LoadIcon(wcex1.hInstance, (LPCTSTR)IDI_SMALL);
RegisterClassEx(&wcex1);
HWND hwnd=CreateWindow("winsample", "winsample", WS_OVERLAPPEDWINDOW,
0,0,800,600,
//CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
WNDCLASSEX wcex2;
wcex2.cbSize = sizeof(WNDCLASSEX);
wcex2.style = CS_HREDRAW | CS_VREDRAW;
wcex2.lpfnWndProc = (WNDPROC)WndProc2;
wcex2.cbClsExtra = 0;
wcex2.cbWndExtra = 0;
wcex2.hInstance = hInstance;
wcex2.hIcon = NULL;//LoadIcon(hInstance, (LPCTSTR)IDI_WINSAMPLE1);
wcex2.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex2.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex2.lpszMenuName = NULL;//(LPCSTR)IDC_WINSAMPLE1;
wcex2.lpszClassName = "win2";
wcex2.hIconSm = NULL;//LoadIcon(wcex2.hInstance, (LPCTSTR)IDI_SMALL);
RegisterClassEx(&wcex2);
//HWND hwnd2=CreateWindow("win2", "win2", WS_CHILDWINDOW|WS_VISIBLE, \
//CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, \
0,0,50,50,\
hwnd, NULL, hInstance, NULL);
HWND hwnd2=CreateWindowEx(WS_EX_CLIENTEDGE,"win2", "win2", WS_CHILDWINDOW|WS_VISIBLE,
0,0,50,50,
hwnd, NULL, hInstance, NULL);
ShowWindow(hwnd2, nCmdShow);
UpdateWindow(hwnd2); while (GetMessage(&msg, NULL, 0, 0))
{
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} return msg.wParam;
}
2。为什么1111得不到键盘? 关键是MessageBox() 返回又导致焦点没有了
3。不是没有得到焦点,而已看不见而已,如 Mackz(在相互) 所说:绘制 虚线 什么的 让人可以看出来
4 。你的代码有点不规范
5。 在你的代码里加一句话就可以了
代码如下:
#include "windows.h"
#include "stdio.h"
HINSTANCE hinst;LRESULT CALLBACK WndProc1(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if(msg==WM_DESTROY)
{ PostQuitMessage(0);return 0;}
if(msg==WM_KEYDOWN||msg==WM_LBUTTONDOWN)
{MessageBox(hwnd,"1111111111111111","1111111111111",MB_OK);}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
LRESULT CALLBACK WndProc2(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if(msg==WM_DESTROY)
{ PostQuitMessage(0);return 0;}
if(msg==WM_KEYDOWN||msg==WM_LBUTTONDOWN)
{MessageBox(hwnd,"2222222222222","22222222222222",MB_OK);
SetFocus(hwnd); //在这加一句~注意只加了这一句 头文件被我改了,你可以改回去可了~
}
if(msg==WM_PAINT)
{
PAINTSTRUCT ps;HDC hdc;
BeginPaint(hwnd,&ps);
char * str="22222222222";
TextOut(hdc,0,0,str,strlen(str));
EndPaint(hwnd,&ps); }
int n=DefWindowProc(hwnd, msg, wParam, lParam);
return n;
}
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndProc2(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
hinst = hInstance;
MSG msg;
WNDCLASSEX wcex1;
wcex1.cbSize = sizeof(WNDCLASSEX);
wcex1.style = CS_HREDRAW | CS_VREDRAW;
wcex1.lpfnWndProc = (WNDPROC)WndProc1;
wcex1.cbClsExtra = 0;
wcex1.cbWndExtra = 0;
wcex1.hInstance = hInstance;
wcex1.hIcon = NULL;//LoadIcon(hInstance, (LPCTSTR)IDI_WINSAMPLE1);
wcex1.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex1.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex1.lpszMenuName = NULL;//(LPCSTR)IDC_WINSAMPLE1;
wcex1.lpszClassName = "winsample";
wcex1.hIconSm = NULL;//LoadIcon(wcex1.hInstance, (LPCTSTR)IDI_SMALL);
RegisterClassEx(&wcex1);
HWND hwnd=CreateWindow("winsample", "winsample", WS_OVERLAPPEDWINDOW,
0,0,800,600,
//CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
WNDCLASSEX wcex2;
wcex2.cbSize = sizeof(WNDCLASSEX);
wcex2.style = CS_HREDRAW | CS_VREDRAW;
wcex2.lpfnWndProc = (WNDPROC)WndProc2;
wcex2.cbClsExtra = 0;
wcex2.cbWndExtra = 0;
wcex2.hInstance = hInstance;
wcex2.hIcon = NULL;//LoadIcon(hInstance, (LPCTSTR)IDI_WINSAMPLE1);
wcex2.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex2.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex2.lpszMenuName = NULL;//(LPCSTR)IDC_WINSAMPLE1;
wcex2.lpszClassName = "win2";
wcex2.hIconSm = NULL;//LoadIcon(wcex2.hInstance, (LPCTSTR)IDI_SMALL);
RegisterClassEx(&wcex2);
//HWND hwnd2=CreateWindow("win2", "win2", WS_CHILDWINDOW|WS_VISIBLE, \
//CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, \
0,0,50,50,\
hwnd, NULL, hInstance, NULL);
HWND hwnd2=CreateWindowEx(WS_EX_CLIENTEDGE,"win2", "win2", WS_CHILDWINDOW|WS_VISIBLE,
0,0,50,50,
hwnd, NULL, hInstance, NULL);
ShowWindow(hwnd2, nCmdShow);
UpdateWindow(hwnd2); while (GetMessage(&msg, NULL, 0, 0))
{
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} return msg.wParam;
}
but hwnd2 still can't show "22222222" on starting.
MS EDIT不知道怎么做到的反屏蔽。2.如何让子窗口被点一下后就可以获得输入焦点呢?
而且还不用显式调用SETFOCUS(子窗口HWND);比如MS EDIT就没有。可能要设置窗口特殊的STYLE.
只要楼主在点击到这个窗口的时候给它SetFocus,就能输入字符了:
LRESULT CALLBACK WndProc2(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if(msg==WM_DESTROY)
{
PostQuitMessage(0);
return 0;
}
if(msg==WM_KEYDOWN)
{
MessageBox(hwnd,"2222222222222","22222222222222",MB_OK);
}
if(msg==WM_LBUTTONDOWN)
{
SetFocus(hwnd);
}
if(msg==WM_PAINT)
{
PAINTSTRUCT ps;
HDC hdc;
char * str="22222222222";
BeginPaint(hwnd,&ps);
TextOut(hdc,0,0,str,strlen(str));
EndPaint(hwnd,&ps); }
int n=DefWindowProc(hwnd, msg, wParam, lParam);
return n;
}
而且还不用显式调用SETFOCUS(子窗口HWND);比如MS EDIT就没有。
谁都没有Edit的实现代码,但我想Edit窗口的属性就决定了他可以点击获得Focus,类似的还有按钮,其实现方式大概也就像上面一样,鼠标点击调用SetFocus,这是可以的,但是一些Static窗口,鼠标点击就不能获得Focus,这些都是这些窗口的代码如何实现决定的
这个呢?
1.初始时子窗口不能显示字符是因为HWND1屏蔽了HWND2,
MS EDIT不知道怎么做到的反屏蔽。
if(msg==WM_LBUTTONDOWN)
{
SetFocus(hwnd);
}
if(msg==WM_KEYDOWN)
{
MessageBox(hwnd,"Key","22222222222222",MB_OK);
}
在2000下调试成功
以后发贴请不要写这样的标题 看了不舒服