不同的視窗,使用同一個視窗程序,這應該在runtime時是多個不同的執行緒吧!?
我有點思維混亂。
這個從代碼段的角度應該是相同的吧!?只是因為函式指標指向導致。但在runtime時形成不同的執行緒,不同的視窗應該不會互相干涉混亂。
我這個理解可對?
uj5u.com熱心網友回復:
“不同的視窗,使用同一個視窗程序”“不同的視窗“, 即不同的 m_hWnd !
uj5u.com熱心網友回復:
之所以有這個問題,就是因為我實在沒法解決edit控制元件的不回應問題,想要自己做一個edit控制元件。但因為程式中會有很多使用它的地方,所以擔心會存在自定義edit控制元件的視窗程序混亂干擾問題。
uj5u.com熱心網友回復:
例子:
// 同類多視窗.cpp : Defines the entry point for the console application.
//
#include <windows.h>
// 隱藏控制臺視窗
#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
#define WM_SETIMAGE WM_APP+1
HINSTANCE 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);
}
}
uj5u.com熱心網友回復:
"自定義edit控制元件的視窗程序"一個實體,一個視窗,一個視窗一個視窗程序。
不屬于多個視窗 ,一個視窗程序。
參考上面的例子 !
uj5u.com熱心網友回復:
所謂視窗程序就是一個回呼函式,被框架層呼叫。 你也可以自己寫底層,底層呼叫視窗程序。至于執行緒與是否互相影響,就看你在這同一個回呼函式的函式體里, 是不是寫了與兩個視窗共享變數的代碼。一般來說,他們都是UI執行緒里的,
UI一般都在主執行緒,就是在一個執行緒。除非你自己把他運行在多個執行緒里。
uj5u.com熱心網友回復:
#3代碼77、78行之間應添加一行DeleteDC(hmemDC);另外在退出視窗或視窗訊息結束后應對hbmpT0~3呼叫DeleteObject
虎頭蛇尾是俗人的習慣,
有始有終是君子的操守。

uj5u.com熱心網友回復:
視窗程序 只是個callback,你可以在視窗程序里得到執行緒id和主執行緒等執行緒id 對比下,就知道運行的架構,順序
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/63988.html
標籤:進程/線程/DLL
