簡單介紹一下,在vs中新建一個WIn32程式,我在里面想重新注冊一個視窗類,并顯示出來,但是發現注冊第二個視窗類總是失敗,求解答
// Win32Project3.cpp : 定義應用程式的入口點。
//
#include "stdafx.h"
#include "Win32Project3.h"
#define MAX_LOADSTRING 100
// 全域變數:
HINSTANCE hInst; // 當前實體
TCHAR szTitle[MAX_LOADSTRING]; // 標題欄文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主視窗類名
// 此代碼模塊中包含的函式的前向宣告:
HWND hWnd,hWnd1,hWnd2;
//TCHAR La=TCHAR("LOVE");
TCHAR szname[]=TEXT("classname");
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc1(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: 在此放置代碼。
MSG msg;
HACCEL hAccelTable;
// 初始化全域字串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_WIN32PROJECT3, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// 執行應用程式初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32PROJECT3));
// 主訊息回圈:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
//
// 函式: MyRegisterClass()
//
// 目的: 注冊視窗類。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32PROJECT3));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WIN32PROJECT3);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
////////////////////////
wcex.cbSize = sizeof(WNDCLASSEX);
WNDCLASSEX wcex2a;
wcex2a.style = CS_HREDRAW | CS_VREDRAW;
wcex2a.lpfnWndProc = WndProc1;
wcex2a.cbClsExtra = 0;
wcex2a.cbWndExtra = 0;
wcex2a.hInstance = hInstance;
wcex2a.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32PROJECT3));
wcex2a.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex2a.hbrBackground = (HBRUSH)(COLOR_WINDOW+24);
wcex2a.lpszMenuName = MAKEINTRESOURCE(IDC_WIN32PROJECT3);
wcex2a.lpszClassName = szname;
wcex2a.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
if(!RegisterClassEx(&wcex2a))
{
MessageBox(hWnd,L"為什么?",L"",MB_OK);
}
return (RegisterClassEx(&wcex));//&&RegisterClassEx(&wcex2a));
}
//
// 函式: InitInstance(HINSTANCE, int)
//
// 目的: 保存實體句柄并創建主視窗
//
// 注釋:
//
// 在此函式中,我們在全域變數中保存實體句柄并
// 創建和顯示主程式視窗。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd,hWnd1,hWnd2;
hInst = hInstance; // 將實體句柄存盤在全域變數中
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
hWnd1 = CreateWindow(szname, L"不同類", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
hWnd2 = CreateWindow(szWindowClass, L"同一個類", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd||!hWnd2)//||!hWnd1)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
ShowWindow(hWnd1, nCmdShow);
UpdateWindow(hWnd1);
ShowWindow(hWnd2, nCmdShow);
UpdateWindow(hWnd2);
return TRUE;
}
//
// 函式: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 處理主視窗的訊息。
//
// WM_COMMAND - 處理應用程式選單
// WM_PAINT - 繪制主視窗
// WM_DESTROY - 發送退出訊息并回傳
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析選單選擇:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意繪圖代碼...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// “關于”框的訊息處理程式。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
LRESULT CALLBACK WndProc1(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析選單選擇:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意繪圖代碼...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
//PostQuitMessage(0);
MessageBox(hWnd,L"我先走了,和你們不一樣",L"NOTE",MB_OK);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
uj5u.com熱心網友回復:
檢查錯誤值,查明錯誤原因uj5u.com熱心網友回復:
好像沒有 wcex2.cbSize = sizeof(wcex2);uj5u.com熱心網友回復:
高手啊,我找了好久都沒找到,太馬虎了。數遍問一下,我關閉第一個視窗(句柄為hWnd)時,三個視窗同時關閉,而先關閉wcex2a對應的視窗時,卻不影響另外2個,這是什么原因呢?uj5u.com熱心網友回復:
高手啊,我找了好久都沒找到,太馬虎了。數遍問一下,我關閉第一個視窗(句柄為hWnd)時,三個視窗同時關閉,而先關閉wcex2a對應的視窗時,卻不影響另外2個,這是什么原因呢?
uj5u.com熱心網友回復:
樓下已經找到原因了,是我馬虎了
編譯沒錯誤,你是說斷點除錯看回傳值么?
順便問一下這個問題:
我關閉第一個視窗(句柄為hWnd)時,三個視窗同時關閉,而先關閉wcex2a對應的視窗時,卻不影響另外2個,這是什么原因呢?是因為只有一盒實體hInst嗎?
uj5u.com熱心網友回復:
下面是 2個視窗 用同一個類時 關閉case WM_DESTROY:
if(m_hwnd1 && m_hwnd2) // there are 2 windows, one of them closes!
{// do not quit !
if(hwnd==m_hwnd1) m_hwnd1=0;
else m_hwnd2=0;
return 1;
}
PostQuitMessage(0);
return 1;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/147898.html
標籤:基礎類
