• ベストアンサー

DirectXでのゲーム作り error C2065: 'MsgProc'の解決法

DirectXについて学びたくなり「15歳から始めるDirectX9 3Dゲームプログラミング」という本を使って勉強しています。 しかしウインドウを作り×ボタンを押したら終了というプログラムの所でエラーがでています。 どうかエラーの原因を教えてください。 #include<windows.h> #include<tchar.h> int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPInst,LPSTR lpCmd, int nCmd){     WNDCLASSEX wc = {sizeof  (WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,hInst,NULL,NULL,NULL,NULL,_T("My Window"),NULL};     RegisterClassEx(&wc);     HWND hWnd = CreateWindow(_T("BUTTON"),_T("ウインド名"),WS_OVERLAPPEDWINDOW,100,100,300,300,NULL,NULL,hInst,NULL);     ShowWindow(hWnd,SW_SHOWDEFAULT);     MSG msg;     ZeroMemory(&msg,sizeof(msg));     while(msg.message!=WM_QUIT){         if(PeekMessage(&msg,NULL,0L,0L,PM_REMOVE)){             TranslateMessage(&msg);             DispatchMessage(&msg);         }     }     UnregisterClass(_T("My Window"),hInst);     return 0; } エラー内容は : error C2065: 'MsgProc' : 定義されていない識別子です。 です。 環境は Microsoft Visual Studio 8 Microsoft DirectX SDK (March 2008) で、環境設定はきちんとできていると思います。 どうかお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • beer30
  • ベストアンサー率100% (1/1)
回答No.2

同じ本使って勉強してます。んで、これ前のページ(P87)でMsgProcのコード載ってますよね。これを加えないとだめです。 LRESULT WINAPI MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { switch(msg) { case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hWnd,msg,wParam,lParam); }

その他の回答 (1)

回答No.1

 こんばんは。エラーを呼んで字の如く"MsgProc"が存在しないか、見えていないのでしょう。  因みに要求されているのはWNDPROC型で、  LRESULT CALLBACK MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)  と言う関数のポインタです。

関連するQ&A

  • 子ウィンドウの作成方法

    #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); TCHAR szClassName[] = TEXT("Window01"); TCHAR szClassName2[] = TEXT("Window02"); int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,LPSTR lpsCmdLine, int nCmdShow){ MSG msg; BOOL bRet; if (!InitApp(hCurInst)) return FALSE; if (!InitInstance(hCurInst, nCmdShow)) return FALSE; while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { if (bRet == -1) { break; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int)msg.wParam; } ATOM InitApp(HINSTANCE hInst) { WNDCLASSEX wc; WNDCLASSEX wc2; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; wc.hIcon = (HICON)LoadImage( NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hCursor = (HCURSOR)LoadImage( NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szClassName; wc.hIconSm = (HICON)LoadImage( NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc2.cbSize = sizeof(WNDCLASSEX); wc2.style = CS_HREDRAW | CS_VREDRAW; wc2.lpfnWndProc = WndProc; wc2.cbClsExtra = 0; wc2.cbWndExtra = 0; wc2.hInstance = hInst; wc2.hIcon = (HICON)LoadImage( NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc2.hCursor = (HCURSOR)LoadImage( NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc2.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wc2.lpszMenuName = NULL; wc2.lpszClassName = szClassName; wc2.hIconSm = (HICON)LoadImage( NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); if((RegisterClassEx(&wc)||RegisterClassEx(&wc2)==0)) return 0; return TRUE; } BOOL InitInstance(HINSTANCE hInst, int nCmdShow) { HWND hWnd; HWND hWnd2; hWnd = CreateWindow(szClassName, TEXT("親ウィンドウ"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL ); if(!hWnd) return FALSE; hWnd2 = CreateWindow(szClassName2, TEXT("子ウィンドウ"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWnd, NULL, hInst, NULL ); if(!hWnd2) return FALSE; ShowWindow(hWnd, nCmdShow); ShowWindow(hWnd2, nCmdShow); UpdateWindow(hWnd); UpdateWindow(hWnd2); return TRUE; } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } 子ウィンドウの作り方を理解したく、ただウィンドウを表示するプログラムを作ろうとしました。 しかし、うまくいきません。 一体なにがダメなんでしょうか?

  • BCCのコンソールアプリからウィンドウ表示

    BCCのコンソールアプリからウィンドウを表示したいのですが、うまくいきません。 なにが悪いのでしょうか・・・ どなたかお教えいただけると助かります。 よろしくお願いいたします。 コンパイラ: Borland C++ 5.5.1 bcc32 コンパイル方法: bcc32 -WC WindowTest.cpp (コンソールアプリにしているのは、標準入力を受け標準出力に出すフィルタ機能も持たせようと思っているからです。) *** ソース (WindowTest.cpp) *** #include <windows.h> LRESULT CALLBACK WndProc ( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp ){ // とりあえず空 (void)hWnd; (void)msg; (void)wp; (void)lp; return 0; } int main (int argc, char**argv){ HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL); WNDCLASSEX wc; char className[] = "hoge"; memset( &wc, 0, sizeof( wc )); wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wc.hCursor = LoadCursor( NULL, IDC_ARROW ); wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); wc.lpszMenuName = NULL; wc.lpszClassName = className; wc.hIconSm = NULL; if(! RegisterClassEx( &wc )) return 1; HWND hWnd = CreateWindow(className, "Title", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, NULL, hInstance, NULL); // ← ここで失敗し、ウィンドウが表示されない if (!hWnd) return 2; ShowWindow(hWnd, NULL); UpdateWindow(hWnd); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } (void)argc; (void)argv; return 0; }

  • ShellAbout(hWnd,"","",LoadIcon(?));

    BCC32 で、 ShellAbout(hWnd,"","",LoadIcon(hInst, IDI_APPLICATION)); ShellAbout(hWnd,"","",LoadIcon(NULL, IDI_APPLICATION)); ↑ならアイコンに関してどっちでもできるけど、リソースで MYICONSM ICON DISCARDABLE "ico.ico" として、 ShellAbout(hWnd,"","",LoadIcon(hInst, "MYICON"); ShellAbout(hWnd,"","",LoadIcon(NULL, "MYICON")); ↑はアイコンに関してどっちも無効で旗になります。 BCC32 で ShellAbout( ) で自作アイコンを表示するには どうしたらいいんですか? #include <windows.h> #include <shellapi.h> HINSTANCE hInst; HICON hIcon; LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){  switch (uMsg){  case WM_LBUTTONDOWN:   ShellAbout(hWnd,"","",?;  break;  case WM_DESTROY:   PostQuitMessage(0);  break;  default:   return DefWindowProc(hWnd,uMsg,wParam,lParam);  }  return 0; } int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int){  HWND hWnd;  WNDCLASSEX wc;  MSG msg;  wc.cbSize =略  wc.style =  wc.lpfnWndProc =  wc.hInstance =  wc.cbClsExtra =  wc.cbWndExtra =  wc.lpszMenuName =  wc.lpszClassName =  wc.hIcon =  wc.hCursor =  wc.hbrBackground =  RegisterClassEx(&wc);  hWnd = CreateWindow(wc.lpszClassName,"TEST",WS_OVERLAPPEDWINDOW,      0,0,640,480,NULL,NULL,hInst,NULL);  ShowWindow(hWnd,SW_SHOWNORMAL);  UpdateWindow(hWnd);  while(GetMessage( &msg, NULL, 0, 0)){   TranslateMessage( &msg );   DispatchMessage( &msg );  }  return 0; }

  • プログラミングでエラーが出ました。教えてください。

    Visual C++ 2010で 1>LINK : fatal error LNK1561: エントリー ポイントを定義しなければなりません。 というエラーが出ました。 プログラムは、↓です。 #include <windows.h> LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); TCHAR szClassName[] = TEXT("sample01"); int WINAPI WInMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow){ MSG msg; BOOL bRet; if(!InitApp(hCurInst)) return FALSE; if(!InitInstance(hCurInst, nCmdShow)) return FALSE; while((bRet = GetMessage(&msg, NULL, 0, 0))!= 0){ if(bRet == -1){ MessageBox(NULL, TEXT("GetMassageエラー"),TEXT("Error"),MB_OK); break; }else{ TranslateMessage(&msg); DispatchMessage(&msg); } } return (int)msg.wParam; } ATOM InitApp(HINSTANCE hInst){ WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; wc.hIcon = (HICON)LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hCursor = (HICON)LoadImage(NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szClassName; wc.hIconSm = (HICON)LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); return (RegisterClassEx(&wc)); } BOOL InitInstance(HINSTANCE hInst, int nCmdShow){ HWND hWnd; hWnd = CreateWindow(szClassName,TEXT("猫でもわかるWindowsプログラミング"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL); if(!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){ switch(msg){ case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } 教えてください。 よろしくお願いします。

  • C言語でWin32APIを使い、子ウィンドウを表示したいのですが。。。

    いつもお世話になっております。 小生、只今C言語とWin32APIを使い、WindowsXPSP3上で、BCC5.5.1を使用し、Windowsプログラミングを勉強しています。 今回、子供ウィンドウを表示しようとしたのですが、 下記のコードをコンパイルしても、子供ウィンドウが表示されません。 大変、申し訳ございませんが、先輩方、アドバイス宜しくお願いします。 /* 子供ウィンドウを作成 */ #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE, LPCSTR); BOOL InitInstance(HINSTANCE, int, LPCSTR); int WINAPI WinMain( HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; BOOL bRet; LPCSTR szClassName = "ChildWindow"; if(!InitApp(hCurInst, szClassName)){ return FALSE; } if(!InitInstance(hCurInst, nCmdShow, szClassName)){ return FALSE; } while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0){ if(bRet == -1){ MessageBox(NULL, "GetMessage Error", "Error", MB_OK); break; } else{ TranslateMessage(&msg); DispatchMessage(&msg); } } return (int)msg.wParam; } //ウィンドウクラスの登録 ATOM InitApp(HINSTANCE hInst, LPCSTR szClassName) { WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; wc.hIcon = (HICON)LoadImage( NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hCursor = (HCURSOR)LoadImage( NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = (LPCSTR)szClassName; wc.hIconSm = (HICON)LoadImage( NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); return (RegisterClassEx(&wc)); } //ウィンドウの生成 BOOL InitInstance(HINSTANCE hInst, int nCmdShow, LPCSTR szClassName) { HWND hWnd; hWnd = CreateWindow( szClassName, "Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL); if(!hWnd){ return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { static HWND hWndChild; HINSTANCE hInst; switch(msg){ case WM_CREATE: hInst = ((LPCREATESTRUCT)lp)->hInstance; hWndChild = CreateWindow( "Child", "子供ウィンドウ", WS_CHILD | WS_SYSMENU | WS_THICKFRAME | WS_CAPTION | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, 200, 100, hWnd, 0, hInst, NULL); ShowWindow(hWndChild, SW_SHOW); UpdateWindow(hWndChild); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; }

  • Windowsプログラミングのひな形の段階でエラーが出てしまいます。

    指定されたパスが見つかりませんと出てウィンドウが生成されません。 コードが違うのでしょうか・・それともプロジェクトの作り方に問題があるのでしょうか。VisualStudio2005のVisual C++でつくっています。 以下コードです↓ //hinagata.cpp #include<windows.h> LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE,int); char szClassName[]="hinagata"; int WINAPIMain(HINSTANCE hCurInst,HINSTANCE hPrevInst,LPSTR lpsCmdline,int nCmdShow) { MSG msg; BOOL bRet; if(!InitApp(hCurInst)) return FALSE; if(!InitInstance(hCurInst,nCmdShow)) return FALSE; while((bRet=GetMessage)&msg,NULL,0,0))!=0){ if(bRet==-1){ MessageBox(NULL,"GetMessageエラー","Error",MB_OK); break; }else{ TranslateMessage(&msg); DispatchMessage(&msg); } } return(int)msg.wParam; } //ウィンドウクラスの登録 ATOM InitApp(HINSTANCE hInst) { WNDCLASSEX wc; wc.cbSize=sizeof(WNDCLASSEX); wc.style=CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc=WndProc; //プロシージャ名 wc.cbClsExtra=0; wc.cbWndExtra=0; wc.hInstance=hInst;//インスタンス wc.hIcon=(HICON)LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE |LR_SHARED); wc.hCursor=(HCORSOR)Loadimage(NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName=NULL;//メニュー名 wc.lpszClassName=(LPCSTR)szClassName; wc.hIconSm=(HICON)LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); return(RegisterClassEx(&wc)); } //ウィンドウの作成 BOOL InitInstance(HINSTANCE hInst,int nCmsShow) { HWND hWnd; hWnd=CreateWindow(szClassName, //タイトルバーにこの名前が表示される "犬でもわかるWindowsプログラミング", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL); if(!hWnd) return FALSE; ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd); return TRUE; } //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp) { switch(msg){ case WM_DESTROY: PostQuitMessage(0); break; dafault: return(DefWindowProc(hWnd,msg,wp,lp)); } return 0; }

  • Win32APIにて、ウィンドウ全体をドラッグして動かしたいのですが。

    こんにちは。 いつもお世話になっております。 小生、只今WindowsXPSP3上で、C言語とWin32APIを使用し、BCC5.5.1でコンパイルしながら、Windowsプログラミングを勉強しています。 度々、質問させて頂き、その都度回答を頂戴し、誠に恐縮ではあるのですが、今回も質問させて下さい。 下記のコードをコンパイルすると、タイトルバーをドラッグして移動する事は出来るのですが、ウィンドウ全体(クライアント領域も含めて)移動するにはどのようにすればいいのでしょうか?? /* ウィンドウ表示 */ #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE, LPCSTR); BOOL InitInstance(HINSTANCE, int, LPCSTR); int WINAPI WinMain( HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; BOOL bRet; LPCSTR szClassName = "Window"; if(!InitApp(hCurInst, szClassName)){ return FALSE; } if(!InitInstance(hCurInst, nCmdShow, szClassName)){ return FALSE; } while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0){ if(bRet == -1){ MessageBox(NULL, "GetMessage Error", "Error", MB_OK); break; } else{ TranslateMessage(&msg); DispatchMessage(&msg); } } return (int)msg.wParam; } //ウィンドウクラスの登録 ATOM InitApp(HINSTANCE hInst, LPCSTR szClassName) { WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; wc.hIcon = (HICON)LoadImage( NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hCursor = (HCURSOR)LoadImage( NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = (LPCSTR)szClassName; wc.hIconSm = (HICON)LoadImage( NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); return (RegisterClassEx(&wc)); } //ウィンドウの生成 BOOL InitInstance(HINSTANCE hInst, int nCmdShow, LPCSTR szClassName) { HWND hWnd; hWnd = CreateWindow( szClassName, "Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 200, 200, NULL, NULL, hInst, NULL); if(!hWnd){ return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch(msg){ case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } お忙しい中申し訳ございませんが、 先輩方、アドバイス宜しくお願い致します。

  • ウィンドウハンドルがメッセージ処理ループの後おかしくなる(?)

    下のコードをコンパイルしても、 WinMain KillTimer hr=ERROR_INVALID_WINDOW_HANDLE (0x00000578) というエラーメッセージが出てうまく通りません。 エラーを無視する意味でKillTimerをせずにやってしまえば、特に問題ないのですが、後々問題が出てきても怖いので、直したいです。 メッセージ処理ループの手前でKillTimerを行うと、エラーは出ませんし、 メッセージ処理ループのすぐ後でSetTimerを行うと、SetTimerでエラーが出るので、 ループでおかしくなるのかな、と思いました。 プログラムをシェイプアップしてもエラーがとれませんし、 もしかして根本的な間違いがあるのでしょうか・・・? #include <windows.h> #include <dxerr9.h> #define kWCLASS_NAME "WndClass" // ウィンドウクラス名 #define kWINDOW_NAME "Wnd" // ウィンドウ名 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow ) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInst; wcex.hIcon = NULL; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName =NULL; wcex.lpszClassName = kWCLASS_NAME; wcex.hIconSm = NULL; RegisterClassEx(&wcex); /* --- メイン・ウィンドウの作成 --- */ HWND hWnd; hWnd = CreateWindow(kWCLASS_NAME, kWINDOW_NAME, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL); /* --- ウィンドウの表示 --- */ ShowWindow( hWnd, SW_SHOWDEFAULT ); UpdateWindow( hWnd ); /* --- タイマのセット --- */ if ( SetTimer( hWnd, 1, 1000, NULL ) == 0 ) // WM_TIMERはWndProcで処理 { DXTRACE_ERR( "WinMain SetTimer", GetLastError() ); return -1; } /* --- メッセージ処理ループ --- */ MSG msg; ZeroMemory( &msg, sizeof( msg ) ); while ( msg.message != WM_QUIT ) // PostQuitMessage()が呼ばれたら終了 { if ( !GetMessage( &msg, NULL, 0, 0 ) ) { msg.message = WM_QUIT; } else { TranslateMessage( &msg ); DispatchMessage( &msg ); } } /* --- タイマの破棄 --- */ if ( KillTimer( hWnd, 1 ) == 0 ) { DXTRACE_ERR( "WinMain KillTimer", GetLastError() ); return -1; } /* --- 終了処理 --- */ // ウィンドウクラスの登録解除 if ( UnregisterClass( kWCLASS_NAME, hInst ) == 0 ) { DXTRACE_ERR( "WinMain UnregisterClass", GetLastError() ); return -1; } return 0; }

  • win32apiでbmpを表示する関数についてです

    bmpを表示する関数と処理する関数を別々のファイルにしたいのですが、表示されません・・・。エラー、警告はありませんでした。VC++2008を使用しています。ソースは以下のようになっています。よろしくお願い致します。 ~ 処理部分 load_bmp.cpp ~ #include <windows.h> #include <stdio.h> #include <tchar.h> extern HINSTANCE hinst; extern HWND hwnd; int Load_Bmp( HDC hdc, char *f_name_of_BMP) { HBITMAP hbmp; HDC work_DC; hbmp=(HBITMAP)LoadImage(hinst,_T ("f_name_of_BMP"),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION | LR_LOADFROMFILE); if( hbmp == NULL ){ MessageBox(hwnd, _T("ビットマップを表示できません"), _T("エラー"),MB_OK | MB_ICONWARNING); return 0; } work_DC = CreateCompatibleDC( hdc ); SelectObject( work_DC, hbmp ); BitBlt(hdc,0,0,640,480,work_DC,0,0,SRCCOPY); ReleaseDC( hwnd,work_DC ); DeleteObject( hbmp ); return 0; } ~ヘッダファイル load_bmp.h ~ int Load_Bmp( HDC hdc,char *f_name_of_BMP); ~処理部分 main.cpp ~ #include <windows.h> #include <tchar.h> #include "load_bmp.h" HWND hwnd; HDC win_hdc; HINSTANCE hinst; void init_game() { Load_Bmp( win_hdc,"test.bmp"); } LRESULT WndProc(HWND hwnd,UINT msg,WPARAM wprm,LPARAM lprm) { switch(msg){ case WM_CREATE: break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,msg,wprm,lprm); } return 0; } int APIENTRY WinMain(HINSTANCE hIns,HINSTANCE hPI,LPSTR lpArg,int nCmdShow) { MSG msg; WNDCLASS wc; hinst=hIns; wc.hInstance=hIns; wc.lpszClassName=_T("test"); wc.lpfnWndProc=(WNDPROC)WndProc; wc.style=0; wc.hIcon=LoadIcon((HINSTANCE)NULL,IDI_APPLICATION); wc.hCursor=LoadCursor((HINSTANCE)NULL,IDC_ARROW); wc.lpszMenuName=0; wc.cbClsExtra=0; wc.cbWndExtra=0; wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); if(RegisterClass(&wc)==0)return 0; hwnd=CreateWindowEx( 0, wc.lpszClassName, _T("test"), WS_OVERLAPPEDWINDOW, 20,20,640,480, NULL, NULL, hIns, NULL     ); if(!hwnd) return 0; ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd); win_hdc=GetDC(hwnd); init_game(); while(1){  if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)){ (!GetMessage(&msg,(HWND)NULL,0,0));break; TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }

  • ウィンドウの作成がうまくいきません。

    C++で一からWin32Apiでウィンドウを作ろうとしています。 単発のウィンドウ表示はうまくいったのですが、複数のウィンドウを表示しようとすると動作が怪しくなります。 以下にプログラムを載せさせて頂きますのでご指摘お願いします。 (1)LRESULT C_BaseWnd::LocalWindProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)の関数でメインウィンドウの処理を行っているのですが、メインウィンドウ上で「a(0x61)」キーを入力したとき新しくサブウィンドウを表示させています。その表示したサブウィンドウを閉じて再度メインウィンドウから「a(0x61)」キーを入力してサブウィンドウを表示しようとしても応答がありません。原因と改善方法を教えていただけるとうれしいです。 (2)そのほか全体的に「この記述おかしいだろう」「こうしたほうがいいんじゃないか」など細かいところでも良いので教えていただけるとうれしいです。 よろしくお願いします。 #include <Windows.h> class C_BaseWnd { public: C_BaseWnd(); virtual ~C_BaseWnd(); virtual HRESULT Init( HINSTANCE hInst, int nCmdShow, LPTSTR className, LPTSTR windowName, UINT width, UINT height, DWORD style, BOOL windowFlag ); virtual void Uninit(void); protected: WNDCLASSEX m_wndClassEx; HWND m_hWnd; // 親のウィンドウプロシージャ virtual LRESULT LocalWindProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); // 子のウィンドウプロシージャ virtual LRESULT ChildWindProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); private: // 個々のウィンドウプロシージャを呼び出すコールバック static LRESULT CALLBACK s_CallWindProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); // メインウィンドウフラグ格納 bool m_bMain; }; int WINAPI WinMain( HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow ) { // 初期化処理 C_BaseWnd *window = new C_BaseWnd(); window->Init( hCurInst, nCmdShow, "Application Name", "Window Name", 1280, 720, WS_OVERLAPPEDWINDOW, true ); MSG msg; while( GetMessage(&msg, NULL, 0, 0) ) { TranslateMessage(&msg); DispatchMessage(&msg); } window->Uninit(); delete window; return 0; } C_BaseWnd::C_BaseWnd() { m_hWnd = NULL; m_bMain = false; } C_BaseWnd::~C_BaseWnd() { } HRESULT C_BaseWnd::Init(HINSTANCE hInst, int nCmdShow, LPTSTR className, LPTSTR windowName, UINT width, UINT height, DWORD style, BOOL windowFlag) { m_wndClassEx.cbSize = sizeof(WNDCLASSEX); m_wndClassEx.lpfnWndProc = s_CallWindProc; m_wndClassEx.style = (CS_HREDRAW | CS_VREDRAW); m_wndClassEx.cbClsExtra = 0; m_wndClassEx.cbWndExtra = 0; m_wndClassEx.hInstance = hInst; m_wndClassEx.hIcon = NULL; m_wndClassEx.hCursor = LoadCursor(NULL, IDC_ARROW); m_wndClassEx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); m_wndClassEx.lpszMenuName = NULL; m_wndClassEx.lpszClassName = className; m_wndClassEx.hIconSm = NULL; if( RegisterClassEx(&m_wndClassEx) == 0 ) return E_FAIL; m_hWnd = CreateWindowEx( 0, className, windowName, style, CW_USEDEFAULT, CW_USEDEFAULT, width, height, NULL, NULL, hInst, NULL); if( m_hWnd == NULL ) return E_FAIL; // 自身をウィンドウハンドルにセットする SetWindowLong( m_hWnd, GWL_USERDATA, (LONG)this ); ShowWindow(m_hWnd, nCmdShow); UpdateWindow(m_hWnd); if( windowFlag ) m_bMain = true; return S_OK; } void C_BaseWnd::Uninit(void) { UnregisterClass(m_wndClassEx.lpszClassName, m_wndClassEx.hInstance); } LRESULT C_BaseWnd::LocalWindProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch( msg ) { case WM_CHAR: if( wParam == 0x61 ) { // サブウィンドウ初期化処理 C_BaseWnd *window2 = new C_BaseWnd(); window2->Init( (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), SW_SHOW, "Application Name2", "Window Name2", 1920, 1080, WS_OVERLAPPEDWINDOW, false ); } break; case WM_DESTROY: PostQuitMessage(0); break; default: break; } return DefWindowProc(hWnd, msg, wParam, lParam); } LRESULT C_BaseWnd::ChildWindProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch( msg ) { case WM_CHAR: break; case WM_CLOSE: break; default: break; } return DefWindowProc(hWnd, msg, wParam, lParam); } LRESULT CALLBACK C_BaseWnd::s_CallWindProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { // セットした個別のインスタンスを取得 C_BaseWnd *pInst = (C_BaseWnd *)GetWindowLong(hWnd, GWL_USERDATA); if( !pInst ) { return DefWindowProc(hWnd, msg, wParam, lParam); } if( pInst->m_bMain ) { return pInst->LocalWindProc(hWnd, msg, wParam, lParam); } else { return pInst->ChildWindProc(hWnd, msg, wParam, lParam); } }

専門家に質問してみよう