不同的窗口,使用同一个窗口过程,这应该在runtime时是多个不同的线程吧!?
我有点思维混乱。
这个从代码段的角度应该是相同的吧!?只是因为函数指针指向导致。但在runtime时形成不同的线程,不同的窗口应该不会互相干涉混乱。我这个理解可对?
我有点思维混乱。
这个从代码段的角度应该是相同的吧!?只是因为函数指针指向导致。但在runtime时形成不同的线程,不同的窗口应该不会互相干涉混乱。我这个理解可对?
解决方案 »
- 紧急求助:vc6.0打印出对话框中的所有内容
- 笔记本使用电池供电时PlaySound没用?
- 关于PropertyPage字体设置问题
- VC6.0+MYSQL5.0的程序设计\请大家点评\指点,不胜感激
- 怎样在我的程序中知道Window文件系统中是否隐藏了文件扩展名
- 变猩猩了,散分。
- 请问怎样可以得到struct的长度?
- 交友!有沒有南京的高手??這個週末有沒有空?我請吃飯!主要時想學習VC
- 【请教】画矩形并刷新屏幕的问题??
- 请高手看看下面的代码有什么错误!!!!1
- UAC打开的情况下,通过com用cocreateinstance创建实例出错
- 想写一个键盘小程序,点击主对话框上面的编辑框弹出键盘,点击键盘上的按钮输入相应的数据
“不同的窗口“, 即不同的 m_hWnd !
之所以有这个问题,就是因为我实在没法解决edit控件的不响应问题,想要自己做一个edit控件。但因为程序中会有很多使用它的地方,所以担心会存在自定义edit控件的窗口过程混乱干扰问题。
//
#include <windows.h>
// 隐藏控制台窗口
#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") #define WM_SETIMAGE WM_APP+1HINSTANCE hInstance;
HWND hwndT0=0,hwndT1=0,hwndT2=0,hwndT3=-0;
HBITMAP hbmpT0=0,hbmpT1=0,hbmpT2=0,hbmpT3=0;
int g_WinNum=0;
//
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
HDC hmemDC;
HBITMAP hbmpOld;
HDC hdc;
RECT rc;
HBITMAP hbmpTmp;
int nWindth;
int nHeight;
POINT pt;
char *fileName;
char txt[10]; PAINTSTRUCT ps;
switch(uMsg)
{
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps);
//
GetClientRect(hwnd, &rc);
nWindth=rc.right-rc.left;
nHeight=rc.bottom-rc.top;
hmemDC=CreateCompatibleDC(hdc);
//
SetBkMode(hdc,TRANSPARENT);
if(hwnd==hwndT0)
{
if(hbmpT0)
{
hbmpOld=(HBITMAP)SelectObject(hmemDC,hbmpT0);
strcpy(txt,"Test0");
}
}
else if(hwnd==hwndT1)
{
if(hbmpT1)
{
hbmpOld=(HBITMAP)SelectObject(hmemDC,hbmpT1);
strcpy(txt,"Test1");
}
}
else if(hwnd==hwndT2)
{
if(hbmpT2)
{
hbmpOld=(HBITMAP)SelectObject(hmemDC,hbmpT2);
strcpy(txt,"Test2");
}
}
else if(hwnd==hwndT3)
{
if(hbmpT3)
{
hbmpOld=(HBITMAP)SelectObject(hmemDC,hbmpT3);
strcpy(txt,"Test3");
}
}
// draw
SetStretchBltMode(hdc,HALFTONE);
StretchBlt(hdc,0,0,nWindth,nHeight,hmemDC,0,0,200,200,SRCCOPY);
// text
TextOut(hdc,0,0,txt,strlen(txt));
// free
SelectObject(hmemDC,hbmpOld);
EndPaint (hwnd, &ps);
return 0;
case WM_SETIMAGE:
fileName=(char *)lParam;
hbmpTmp=(HBITMAP)::LoadImage(NULL,fileName,IMAGE_BITMAP,0,0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION );
if(hwnd==hwndT0)
{
hbmpT0=hbmpTmp;
}
else if(hwnd==hwndT1)
{
hbmpT1=hbmpTmp;
}
else if(hwnd==hwndT2)
{
hbmpT2=hbmpTmp;
}
else if(hwnd==hwndT3)
{
hbmpT3=hbmpTmp;
}
return 0;
case WM_SETCURSOR:
GetClientRect(hwnd, &rc);
GetCursorPos(&pt);
ScreenToClient(hwnd,&pt);
if(PtInRect(&rc,pt))
{
lParam=HTCLIENT;// arrow
}
break;
case WM_DESTROY:
g_WinNum--;
if (g_WinNum==0) PostQuitMessage(0);
return 0;
}
return DefWindowProc( hwnd, uMsg, wParam, lParam);
}
//
void initRegister()
{
hInstance = GetModuleHandle(NULL);
WNDCLASS wndc;
wndc.cbClsExtra = 0;
wndc.cbWndExtra = 0;
wndc.hCursor = LoadCursor(hInstance, IDC_ARROW);
wndc.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wndc.lpszMenuName = NULL;
wndc.style = CS_HREDRAW | CS_VREDRAW;
wndc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wndc.lpfnWndProc = WindowProc;
wndc.lpszClassName = "classname";
wndc.hInstance = hInstance;
//
RegisterClass(&wndc);
}
//
HWND createWidget(char *name, int x, int y, int width, int height)
{
HWND hWnd=0;
hWnd = CreateWindow("classname", name,
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
x, y, width, height,
NULL,
NULL, // (HMENU) (int) (ID_FIRSTCHILD + i), =100....
hInstance,
NULL);
//
g_WinNum++;
//
return hWnd;
}
//
void SetWndImage(HWND hWnd,char *fileName)//这个只是通知显示图片
{
SendMessage(hWnd,WM_SETIMAGE,0,(LPARAM)fileName);
}
//
#define ScreenX 240
#define ScreenY 100
void main()
{//
initRegister();
hwndT0=createWidget("test0",ScreenX,ScreenY,300,300);
SetWndImage(hwndT0, "a.bmp");
hwndT1=createWidget("test1",ScreenX+300,ScreenY,300,300);
SetWndImage(hwndT1, "b.bmp");
// row 2
hwndT2=createWidget("test2",ScreenX,ScreenY+300,300,300);
SetWndImage(hwndT2, "c.bmp");
hwndT3=createWidget("test3",ScreenX+300,ScreenY+300,300,300);
SetWndImage(hwndT3, "d.bmp");
//
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
不属于多个窗口 ,一个窗口过程。
参考上面的例子 !
UI一般都在主线程,就是在一个线程。除非你自己把他运行在多个线程里。
另外在退出窗口或窗口消息结束后应对hbmpT0~3调用DeleteObject虎头蛇尾是俗人的习惯,
有始有终是君子的操守。