私はWin32 APIをゆっくりと学んでおり、これに困惑しています:
「Classic Look」と「Windows 7 Aero Glass」の両方の外観で Windows 7 で実行すると、すべて問題なく、コントロールに Aero の外観があり、その外観では正常に見えます。これを XP マシンで「クラシック ルック」で実行すると、すべて問題ないように見えますが、「Windows XP テーマ」で XP で実行すると、上記の結果が得られます。
http://msdn.microsoft.com/en-us/library/bb773175%28VS.85%29.aspxの Visual Styles に関する Microsoft のガイドラインに従って、3 つのことを行う必要がありました。
1. ComCtl32.lib にリンクし、InitCommonControls を呼び出します。
これを確認して、リンカー設定にcomctl32を追加しました。
2. XML マニフェスト形式のソース ツリーに、YourApp.exe.manifest という名前のファイルを追加します。
チェック、これをしました。私は使用していたバージョンを持っていましたが、安全のために、彼らのサイトで提案されているバージョンを試してみました. (はい、アプリケーションの名前を付けることを知っています....)
3. 次のように、アプリケーションのリソース ファイルにマニフェストを追加します。
チェック、これをしました。彼らが提案する指定された行をrcファイルに追加しました。
したがって、すべての条件下で、Windows XP スタイルのテーマを除いてすべてが機能します。
私が残っていると考えている唯一のことは、どういうわけか私はWM_PAINTメッセージに応答していないということですが、それをデフォルトのウィンドウプロシージャに渡して、ウィンドウがその点でそのことをできるようにしています。(それが機能していないかどうかはわかりませんでした。他の場所では機能しません。)
この投稿と同様の投稿を見たところ、InitCommonControlsEx を使用するように言われましたが、それも役に立ちませんでした。
私は困惑しています。
#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <uxtheme.h>
#include <iostream>
using namespace std;
#define IDC_MAIN_BUTTON_1 101 // Button identifier
#define IDC_MAIN_BUTTON_2 102 // Button identifier
#define IDC_MAIN_BUTTON_3 103 // Button identifier
#define IDC_MAIN_BUTTON_4 104 // Button identifier
HWND hWndButton1;
HWND hWndButton2;
HWND hWndButton3;
HWND hWndButton4;
MSG msg;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK MyWndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass,
DWORD_PTR dwRefData);
int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInst,
LPSTR lpCmdLine,
int ShowCmd) {
INITCOMMONCONTROLSEX icc;
// Initialize common controls.
icc.dwSize = sizeof(icc);
icc.dwICC = ICC_WIN95_CLASSES |
ICC_COOL_CLASSES |
ICC_INTERNET_CLASSES |
ICC_LINK_CLASS |
ICC_STANDARD_CLASSES |
ICC_USEREX_CLASSES;
InitCommonControlsEx(&icc);
WNDCLASSEXW wClass;
ZeroMemory(&wClass,sizeof(WNDCLASSEXW));
wClass.cbSize = sizeof(WNDCLASSEX);
wClass.hInstance = hInstance;
wClass.lpszClassName = L"Window Class";
wClass.lpfnWndProc = (WNDPROC)WndProc;
wClass.style = CS_HREDRAW | CS_VREDRAW;
wClass.lpszMenuName = NULL;
wClass.hbrBackground = (HBRUSH)COLOR_WINDOW;
wClass.hCursor = LoadCursor(NULL,IDC_ARROW);
wClass.hIcon = NULL;
wClass.hIconSm = NULL;
wClass.cbClsExtra = 0;
wClass.cbWndExtra = 0;
RegisterClassEx(&wClass);
HWND hWnd=CreateWindowExW(
0, // in DWORD dwExStyle,
L"Window Class", // in_opt LPCTSTR lpClassName,
L"Windows application", // in_opt LPCTSTR lpWindowName,
WS_OVERLAPPEDWINDOW, // in DWORD dwStyle,
200, // in int x,
200, // in int y,
640, // in int nWidth,
480, // in int nHeight,
NULL, // in_opt HWND hWndParent,
NULL, // in_opt HMENU hMenu,
hInstance, // in_opt HINSTANCE hInstance,
NULL); // in_opt LPVOID lpParam
ShowWindow(hWnd,ShowCmd);
ZeroMemory(&msg,sizeof(MSG));
while(GetMessageW(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
return (int)&msg.wParam;
}
void Button_Proc (WPARAM, LPARAM);
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
HWND GROUP1 = 0;
HWND GROUP2 = 0;
switch(msg)
{
case WM_CREATE:
{
// Create a group box
GROUP1 = CreateWindowExW(
0,
L"BUTTON",
L"Group",
WS_TABSTOP |
WS_VISIBLE |
WS_CHILD |
BS_NOTIFY |
BS_GROUPBOX ,
100,
60,
150,
80,
hWnd,
0,
GetModuleHandle(NULL),
0);
SetWindowSubclass(GROUP1, (SUBCLASSPROC) MyWndProc, 0, 0);
// Create a group box
GROUP2=CreateWindowExW(
0,
L"BUTTON",
L"Group 2",
WS_TABSTOP |
WS_VISIBLE |
WS_CHILD |
BS_GROUPBOX ,
100,
160,
150,
80,
hWnd,
0,
GetModuleHandle(NULL),
0);
SetWindowSubclass(GROUP2, (SUBCLASSPROC) MyWndProc, 0, 0);
// Create a push button
hWndButton1=CreateWindowExW(
0,
L"BUTTON",
L"Option 1",
WS_TABSTOP |
WS_VISIBLE |
WS_CHILD |
WS_GROUP |
BS_NOTIFY |
BS_AUTORADIOBUTTON ,
10,
20,
100,
24,
GROUP1,
(HMENU)IDC_MAIN_BUTTON_1,
GetModuleHandle(NULL),
0);
hWndButton2=CreateWindowExW(
0,
L"BUTTON",
L"Option 2",
WS_TABSTOP |
WS_VISIBLE |
WS_CHILD |
BS_NOTIFY |
BS_AUTORADIOBUTTON ,
10,
45,
100,
24,
GROUP1,
(HMENU)IDC_MAIN_BUTTON_2,
GetModuleHandle(NULL),
0);
hWndButton3=CreateWindowExW(
0,
L"BUTTON",
L"Option 3",
WS_TABSTOP |
WS_VISIBLE |
WS_CHILD |
WS_GROUP |
BS_NOTIFY |
BS_AUTORADIOBUTTON ,
10,
20,
100,
24,
GROUP2,
(HMENU)IDC_MAIN_BUTTON_3,
GetModuleHandle(NULL),
0);
hWndButton4=CreateWindowExW(
0,
L"BUTTON",
L"Option 4",
WS_TABSTOP |
WS_VISIBLE |
WS_CHILD |
BS_NOTIFY |
BS_AUTORADIOBUTTON ,
10,
45,
100,
24,
GROUP2,
(HMENU)IDC_MAIN_BUTTON_4,
GetModuleHandle(NULL),
0);
}
break;
case WM_NOTIFY:
switch(LOWORD(wParam))
{
case IDC_MAIN_BUTTON_1:
case IDC_MAIN_BUTTON_2:
case IDC_MAIN_BUTTON_3:
case IDC_MAIN_BUTTON_4:
{
Button_Proc(wParam,lParam);
}
break;
}
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_MAIN_BUTTON_1:
case IDC_MAIN_BUTTON_2:
case IDC_MAIN_BUTTON_3:
case IDC_MAIN_BUTTON_4:
{
Button_Proc(wParam,lParam);
}
break;
}
break;
case WM_DESTROY:
{
RemoveWindowSubclass(GROUP1, (SUBCLASSPROC) MyWndProc, 0);
RemoveWindowSubclass(GROUP2, (SUBCLASSPROC) MyWndProc, 0);
PostQuitMessage(0);
return 0;
}
break;
}
return DefWindowProcW(hWnd,msg,wParam,lParam);
}
void Button_Proc (WPARAM wParam, LPARAM lParam) {
switch (HIWORD(wParam))
{
case BN_CLICKED:
{
cerr << "Button clicked\n";
}
break;
case BN_DBLCLK:
{
cerr << "Button Double clicked\n";
}
break;
case BN_KILLFOCUS:
{
cerr << "Button Lost Focus\n";
}
break;
case BN_SETFOCUS:
{
cerr << "Button Set Focus\n";
}
break;
// case BCN_HOTITEMCHANGE: // Controls Version 6.
// case BCN_DROPDOWN: // Controls Version 6.
// case NM_CUSTOMDRAW: // Controls Version 6.
// case WM_CTLCOLORBTN: // Investigation Required.
}
// //http://msdn.microsoft.com/en-us/library/windows/desktop/bb849167(v=vs.85).aspx
// if ( Button_GetCheck((HWND) lParam) == BST_UNCHECKED) {
// Button_SetCheck( (HWND) lParam, BST_CHECKED);
// } else {
// Button_SetCheck( (HWND) lParam, BST_UNCHECKED);
// }
}
LRESULT CALLBACK MyWndProc (HWND hWnd,
UINT msg,
WPARAM wParam,
LPARAM lParam,
UINT_PTR uIdSubclass,
DWORD_PTR dwRefData) {
// cerr << "Subclass Proc Called\n";
switch (msg) {
case WM_COMMAND: {
switch(LOWORD(wParam)) {
case IDC_MAIN_BUTTON_1:
case IDC_MAIN_BUTTON_2:
case IDC_MAIN_BUTTON_3:
case IDC_MAIN_BUTTON_4: {
Button_Proc(wParam,lParam);
}
break;
}
}
break;
}
return DefSubclassProc(hWnd, msg, wParam, lParam);
}