Windowsタスクバーにツールバーを作成する方法

このQ&Aのポイント
  • Windows XP / Borland C++Builder 6 pro環境でウィンドウズスタイルを使ったタスクバーを作成する方法について教えてください。
  • Windows XP / Borland C++Builder 6 pro環境ではuxtheme.libがないため、ウィンドウズスタイルが使えません。ウィンドウズスタイルを使用してタスクバーを作成する方法をご教示ください。
  • Windws SDK v6.0とv7.1からUxtheme.libを入手しましたが、PCの中のsytem32にあるuxtheme.dll(6.0.2900.5512)とは合わないようです。 Windows XP / Borland C++Builder 6 pro(uxthemeが無い環境)でウィンドウズスタイルを使うための具体的な方法を教えてください。
回答を見る
  • ベストアンサー

Windowsタスクバーにツールバーを作成(2)

前回、以下サイトを紹介いただき、何とかデスクバンドを作成することができました。 http://msdn.microsoft.com/en-us/library/aa969320.aspx http://eternalwindows.jp/shell/shellex/shellex13.html しかし、こちらの環境は WIndows XP / Borland C++Builder 6 proなのですが、 uxtheme.libがないため、ウィンドウズスタイルが使えません。 ウィンドウズスタイルを使ったタスクバーと自作したデスクバンドに違和感があり、何とかウィンドウズスタイルを使用したいのです。 MSNサイトから、Windws SDK v6.0とv7.1をダウンロードしてUxtheme.libを入手したのですがPCの中のsytem32にあるuxtheme.dll(6.0.2900.5512)と合わないようです。 どなたか、WIndows XP / Borland C++Builder 6 pro(uxthemeが無い環境)でウィンドウズスタイルを使える方法を教えていただけないでしょうか。 具体的には以下コードが使いたいのです。 宜しくお願いします。 <ONPAINTコード> HTHEME htheme; HDC hdcPaint; HPAINTBUFFER hBufferedPaint; DTTOPTS dttOpts; htheme = OpenThemeData(NULL, L"TASKBAND"); hBufferedPaint = BeginBufferedPaint(hdc, &rc, BPBF_TOPDOWNDIB, NULL, &hdcPaint); DrawThemeParentBackground(m_hwnd, hdcPaint, &rc); ZeroMemory(&dttOpts, sizeof(DTTOPTS)); dttOpts.dwSize = sizeof(DTTOPTS); dttOpts.dwFlags = DTT_COMPOSITED | DTT_TEXTCOLOR; dttOpts.crText = crText; DrawThemeTextEx(htheme, hdcPaint, 0, 0, szText, -1, DT_SINGLELINE | DT_CENTER | DT_VCENTER, &rc, &dttOpts); EndBufferedPaint(hBufferedPaint, TRUE); CloseThemeData(htheme);

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

  • ベストアンサー
回答No.1

ウィンドウズスタイルというのが何のことか、いまひとつピンとこないですが・・・。 http://msdn.microsoft.com/en-us/library/bb773257(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/bb773317(v=vs.85).aspx によると BeginBufferedPaint とか DrawThemeTextEx とかって Vista 以降ってなってますから、普通に考えると XP では使えないと思います・・・。 DrawThemeParentBackground は XP でも使えますから、↓くらいで我慢するしかないんじゃないでしょうか。 ( 質問に掲載されていた Microsoft のページを参考にしています。) WM_PAINT の処理 RECT rc; PAINTSTRUCT ps; COLORREF crText = RGB( 255, 255, 255 ); TCHAR szText[] = TEXT("My DeskBand"); BeginPaint( m_hwnd, &ps ); GetClientRect( m_hwnd, &rc ); DrawThemeParentBackground( m_hwnd, ps.hdc, &rc ); SetTextColor( ps.hdc, crText ); SetBkMode( ps.hdc, TRANSPARENT ); DrawTextW( ps.hdc, szText, -1, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE ); EndPaint( m_hwnd, &ps );

toshi_yn
質問者

お礼

回答ありがとうございます。 MSNサイトから、Windws SDK v6.0とv7.1をダウンロードしてUxtheme.libを追加、Uxtheme.hをincludeして早速、試してみましたが「未定義シンボル__in」エラーが出てしまいました。 入手したUxtheme.libではダメみたいです。 もう少し、頑張ってみます。

その他の回答 (1)

回答No.2

もし、.h、LIB の設定が Borland C++ の .h、LIB を使用する設定のままでしたら、Borland C++ の方を無効にして、ダウンロードした新しい方を使用する設定にしてみてはどうでしょう。

toshi_yn
質問者

お礼

アドバイスありがとうございます。 Borland C++Builderには元々uxtheme.hとuxtheme.libはなく、SDK 6.0/7.1のものを使っています。でも、状況は1)の通りです。今、別バージョンのSDKではと思い、今、ダウンロードしています。 何とかなれば良いのですが・・・・。

toshi_yn
質問者

補足

uxtheme.libの件は「VC向けのlibファイルは、C++Builderでは使えない」というのが原因だということが分かりました。implibコマンドでBCB用のlibファイルを作成する必要があり、解決しました。

関連するQ&A

  • Windowsタスクバーにツールバーを作成(3)

    前回、以下サイトを紹介いただき、何とかデスクバンドを作成することができました。 http://eternalwindows.jp/shell/shellex/shellex13.html http://msdn.microsoft.com/en-us/library/aa969320.aspx 現在、他アプリから、デスクバンドの登録と解除を行っていますが、デスクバンドの表示と非表示を同様に他アプリから、行いたいと考えております。 上記参考URLでは以下のように記載されていたのですが、当方の環境(WIndows XP / Borland C++Builder 6 pro)では以下コードはそのまま使えません。 どなたか、ご教授をお願いします。 <参考コード、Vista以降です> CLSID clsid = {0x112143a6, 0x62c1, 0x4478, {0x9e, 0x8f, 0x87, 0x26, 0x99, 0x25, 0x5e, 0x2e}}; HRESULT hr; ITrayDeskBand *pTrayDeskBand; CoInitialize(NULL); hr = CoCreateInstance(CLSID_TrayDeskBand, NULL, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&pTrayDeskBand)); if (FAILED(hr)) { CoUninitialize(); } pTrayDeskBand->ShowDeskBand(clsid); pTrayDeskBand->Release(); CoUninitialize();

  • OLEサーバコンポーネントを作ってますが、、、

    CやVB6の経験は長いが、C++については、初心者です。 WordにOLE埋め込みするOLEサーバコンポーネントをC++で作ってます。 (Wordがコンテナです) RECT上にBitbltで、Gif画像を描いていて、それは、ちゃんと表示されているのですが、 いざ、Wordに埋め込むために、更新メニュークリック時のMsgループ内で if (m_bEmbedding && m_pDataAdviseHolder != NULL){      m_pDataAdviseHolder->SendOnDataChange(static_cast<IDataObject *>(this), 0, DVASPECT_CONTENT); } m_bDirty = TRUE; とやってるのですが、RECTの枠しかWord上に表示されません。 どのメソッドを調べればいいのか、お教え下さい。 一応、GetData にブレークポイントを入れているのですが、引っかかりません。 ただ、RECTの枠だけは、Word上に出てはいます。 尚、プログラムの大枠は、EternalWindowsさんの http://eternalwindows.jp/ole/oleembedded/oleembedded10.html を使わさせて頂いております。 それから、RECT上にBitbltで、Gif画像を描くのは、以下のようにしています。 void CObject::DrawShape(HDC hdc) { int i; RECT rc; long PictureWidth; long PictureHeight; i = 0; rc = m_shape[i].rc; Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom); if (m_vbHDC != NULL){      PictureWidth = rc.right - rc.left;      PictureHeight = rc.bottom - rc.top;      BitBlt(hdc, 0,0, PictureWidth, PictureHeight, m_vbHDC, 0,0, SRCCOPY); } それと、メタファイルの作成は、、、 x=0; y=0; GetSize(&nWidth, &nHeight); SetRect(&rc, x, y, x + nWidth, y + nHeight); hdc = CreateEnhMetaFile(m_vbHDC, NULL, &rc, "AAA"); SetMapMode(hdc, MM_ANISOTROPIC); SetWindowOrgEx(hdc, 0, 0, NULL); SetWindowExtEx(hdc, nWidth, nHeight, NULL); DrawShape(hdc); hmf = CloseEnhMetaFile(hdc); sizel.cx = nWidth; sizel.cy = nHeight; DPtoHIMETRIC(&sizel); hglobal = GlobalAlloc(GPTR, sizeof(METAFILEPICT)); lpmf = (LPMETAFILEPICT)GlobalLock(hglobal); lpmf->hMF = (HMETAFILE)hmf; lpmf->mm = MM_ANISOTROPIC; lpmf->xExt = sizel.cx; lpmf->yExt = sizel.cy; GlobalUnlock(hglobal); //if (bEnhance) { DWORD dwSize; LPBYTE lpData; HGLOBAL hglobalOld = hglobal; dwSize = GetMetaFileBitsEx(lpmf->hMF, 0, NULL); lpData = (LPBYTE)GlobalAlloc(GPTR, dwSize); GetMetaFileBitsEx(lpmf->hMF, dwSize, lpData); hglobal = (HGLOBAL)SetWinMetaFileBits(dwSize, lpData, NULL, lpmf); GlobalFree(lpData); GlobalFree(hglobalOld); //} return hglobal; です。 忌憚のないご指摘をお願いします。

  • ウィンドウが閉じない

    お世話になります。 Adobe Illustratorは起動時にポップアップウィンドウを表示してプラグインを読み込む処理をリアルタイムに見せていますが、それに似た処理をしたいと思っています。 WinMain関数でポップアップウィンドウを生成した後メインウィンドウを生成し、メインウィンドウのWM_CREATEの最後でポップアップウィンドウを消すため ShowWindow(hhwnd, SW_HIDE); や DestroyWindow(hhwnd); を入れました。 ですが、ポップアップウィンドウが消えてくれません。 ポップアップウィンドウは winc.style = CS_HREDRAW | CS_VREDRAW; winc.lpfnWndProc = sWndProc; winc.cbClsExtra = winc.cbWndExtra = 0; winc.hInstance = hInst; winc.hIcon = NULL; winc.hCursor = LoadCursor(NULL, IDC_ARROW); winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); winc.lpszMenuName = NULL; winc.lpszClassName = TEXT("START"); HWND hhwnd = CreateWindowEx(  WS_EX_TOOLWINDOW,  "START", "",  WS_POPUP | WS_VISIBLE | WS_BORDER ,  0 , 0 , 1 , 1 , NULL , NULL ,  hInst , NULL ); で生成し、ウィンドウプロシージャ内は HDC hdc; PAINTSTRUCT ps; static RECT re; int w = 600; int h = 30; switch (msg) { case WM_CREATE:  MoveWindow(hWnd,   (GetSystemMetrics(SM_CXSCREEN)-w)/2,   (GetSystemMetrics(SM_CYSCREEN)-h)/2,   w, h, 1);  InvalidateRect(hWnd, NULL, 1);  break; case WM_PAINT:  hdc = BeginPaint(hWnd, &ps);  SetTextColor(hdc, RGB(0, 0, 0));  if (DrawText(hdc, str, -1, &re, DT_SINGLELINE | DT_CENTER | DT_VCENTER) == 0)   MessageBox(NULL, "err", "", NULL);  EndPaint(hWnd, &ps);  return 0; case WM_SIZE:  GetClientRect(hWnd, &re);  break; } return DefWindowProc(hWnd, msg, wp, lp); のようになっています。ポップアップウィンドウが消えないのはなぜでしょうか。。。

  • PrintScreenKey押下でメモリはどこで取得?

    PrintScreenKey押下で mspaint(画像処理ソフト)で「貼り付け」をすると 画像が張り付けられますが、この過程をプログラミングしたいのですが どうしたらいいですか? どのようにOSメモリに保存された画像ポインタの先頭を取得 できますか? PrintScreenKeyをプログラミングするのは以下の様になるのは 知っています。 desktop=GetDesktopWindow();//デスクトップのハンドルを取得 GetWindowRect(desktop,&rc);//デスクトップのRECT情報を取得 width=rc.right; height=rc.bottom; //DIBの情報を設定する bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); bmpInfo.bmiHeader.biWidth=width; bmpInfo.bmiHeader.biHeight=height; bmpInfo.bmiHeader.biPlanes=1; bmpInfo.bmiHeader.biBitCount=32; bmpInfo.bmiHeader.biCompression=BI_RGB; //DIBSection作成 hdc=GetDC(hWnd); hBitmap=CreateDIBSection(hdc,&bmpInfo,DIB_RGB_COLORS,(void**)&lpPixel,NULL,0); hMemDC=CreateCompatibleDC(hdc); SelectObject(hMemDC,hBitmap); ReleaseDC(hWnd,hdc); fopen_s(&fpt,"ScreenCapture.bmp","wb"); //スクリーンをDIBSectionにコピー hdc=GetDC(desktop); BitBlt(hMemDC,0,0,width,height,hdc,0,0,SRCCOPY); ReleaseDC(desktop,hdc); BITMAPINFOHEADER bmih; BITMAPFILEHEADER bmfh; //RGBQUAD rgbquad; DWORD filesize,bmfhsize,bmihsize,rgbquadsize; bmfhsize=sizeof(bmfh); bmihsize=sizeof(bmih); //rgbquadsize=sizeof(rgbquad); filesize=bmfhsize+bmihsize+width*height; ::ZeroMemory(&bmfh, bmfhsize); ::ZeroMemory(&bmih, bmihsize); bmfh.bfType=0x4d42; bmfh.bfSize=filesize; bmfh.bfReserved1=0; bmfh.bfReserved2=0; bmfh.bfOffBits=bmfhsize+bmihsize; bmih.biSize=bmihsize; bmih.biWidth=width; bmih.biHeight=height; bmih.biPlanes=1; bmih.biBitCount=32; bmih.biClrUsed=2; bmih.biCompression=BI_RGB;//無圧縮形式 bmih.biSizeImage=0;//BI_RGBをセットした場合、0が好ましいとMSDNに書いてあった。 bmih.biXPelsPerMeter=0; bmih.biYPelsPerMeter=0; bmih.biClrImportant=0; fwrite(&bmfh,sizeof(unsigned char),bmfhsize,fpt); fwrite(&bmih,sizeof(unsigned char),bmihsize,fpt); fwrite(lpPixel,sizeof(DWORD),width*height,fpt);

  • BMPの保存

    プリントスクリーンをして、それをBMP形式で保存しようとしているのですが、保存後のファイルを開いてウィンドウを動かすと、それにつれ逐次、画像が更新されていきます。 この問題の原因がわかる方、助言をお願いします。 プログラムはC++で作成しています。 下にソースを載せています。 宜しくお願いします。 #include<windows.h> LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; static BITMAPINFO bmpInfo; static LPDWORD lpPixel; static HBITMAP hBitmap; static HDC hMemDC; HWND desktop; RECT rc; static int width,height; switch(uMsg) { case WM_CREATE: //スクリーンの情報を得る desktop=GetDesktopWindow(); GetWindowRect(desktop,&rc); width=rc.right; height=rc.bottom; //DIBの情報を設定する bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); bmpInfo.bmiHeader.biWidth=width; bmpInfo.bmiHeader.biHeight=height; bmpInfo.bmiHeader.biPlanes=1; bmpInfo.bmiHeader.biBitCount=32; bmpInfo.bmiHeader.biCompression=BI_RGB; //DIBSection作成 hdc=GetDC(hWnd); hBitmap=CreateDIBSection(hdc,&bmpInfo,DIB_RGB_COLORS,(void**)&lpPixel,NULL,0); hMemDC=CreateCompatibleDC(hdc); SelectObject(hMemDC,hBitmap); ReleaseDC(hWnd,hdc); //スクリーンをDIBSectionにコピー hdc=GetDC(desktop); BitBlt(hMemDC,0,0,width,height,hdc,0,0,SRCCOPY); ReleaseDC(desktop,hdc); return 0; case WM_DESTROY: //自らlpPixelを解放するべからず DeleteDC(hMemDC); DeleteObject(hBitmap); //BMPを削除した時、lpPixelも自動的に解放される PostQuitMessage(0); return 0; case WM_PAINT: hdc=BeginPaint(hWnd,&ps); //表画面へ転送 BitBlt(hdc,0,0,width,height,hMemDC,0,0,SRCCOPY); EndPaint(hWnd,&ps); return 0; } SaveBitmap((HWND)hWnd,"PrintScreen.BMP"); return DefWindowProc(hWnd,uMsg,wParam,lParam); } int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow) { WNDCLASS wc; MSG msg; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WindowProc; 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 = __FILE__; if(!RegisterClass(&wc)) return 0; HWND hWnd=CreateWindow( __FILE__,"スクリーンキャプチャ", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hInstance,NULL); if(hWnd==NULL) return 0; BOOL bRet; while((bRet=GetMessage(&msg,NULL,0,0))!=0){ if(bRet==-1) break; DispatchMessage(&msg); } return (int)msg.wParam; }

  • BCBで作成したDLLを、VC++で静的リンクさせる方法

    BCBで作成したDLLを、VC++で静的リンクさせる方法 Borland C++ Builderで作成したDLLを、VC++アプリケーションで利用できるように LIBファイルに変換したいのですが、上手くいきません。 下記の手順を踏みました。 1. BCBでDLL作成   「VC++スタイルのDLL」で作成、   「VCLを使う」「CLXを使う」「マルチスレッドを使う」はチェックせず 2. コマンドラインで「IMPDEF.exe」を使用して、dllからdefファイル作成   (IMPDEF.exeは、\Borland\CBuilder6\Binに格納されていた) 3. コマンドラインで「LINK.exe」「LIB.exe」を使用して、defからlibファイル作成   (LINK.exeとLIB.exeは、\Microsoft Visual Studio\VC98\Binに格納されていた) 4. VC++プロジェクトファイルを保存したフォルダに、DLLファイルとlibファイルをコピー 5. VC++の「プロジェクト」-「設定」-「リンク」-「オブジェクト/ライブラリモジュール」に   作成したlibファイルを追加 VC++プロジェクトをビルドすると、下記のエラーメッセージが表示されます。 ///////////////////////////////////////////////////////////////////////////////// dllread.obj : error LNK2001: 外部シンボル "__imp__(関数名)@0" は未解決です LIBC.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です Release/dllread.exe : fatal error LNK1120: 外部参照 2 が未解決です。 link.exe の実行エラー ///////////////////////////////////////////////////////////////////////////////// BCBとVC++のバージョンは、下記の通りです。 BCB Professional 6.0 VC++ 6.0 ちなみに、同じDLLを動的リンクで利用することは出来ました。 初心者の質問で申し訳ございませんが、解決策が分かる方がいらっしゃいましたら 教えていただけないでしょうか?

  • LPTSTR型の変数に文字を格納

    LPTSTR型の変数に文字を格納 現在C言語でWindowsプログラミングを学習しています。 LPTSTR 型の変数にキーボードから入力されて1文字づつ格納したいのですが、 下記のコードであればうまくいきません。 自分がTCHARやLPTSTRのことを根本から理解できていないのが原因だと思うのですが。 LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp) { static LPTSTR buffer; HDC hdc; PAINTSTRUCT ps; switch(msg){ case WM_CHRAR: *buffer++=(TCHAR)wp; InvalidateRect(hWnd,NULL,TRUE); return 0; case WM_PRINT: hdc=BeginPaint(hWnd,&ps); DrawText(hdc,buffer,-1,&rc,DT_WORDBREAK); EndPaint(hWnd,&ps); return 0; ・ ・ ・ ・

  • 画像表示について

    画像を表示させたいのですがうまくいきません。 途中まで打ってみたのでご意見お願いします。 (リソースから読み込んで表示させる方法) 環境:MicrosoftVisualC++ SDK ******省略********* case WM_PAINT:   hdc = BeginPaint(hWnd,&ps);   //ビットマップリソースハンドルの取得   hBmp = LoadBitmap( hInst, MAKEINTRESOURCE(IDB_BITMAP1));   if(hBmp == NULL){     MessageBox(hWnd,"ファイルの読み込みに失敗しました。","エラー",MB_ICONWARNING | MB_OK);     exit(1);   }   //ビットマップの大きさの情報取得   GetObject(hBmp,(int)sizeof(BITMAP),&bmp_info);   w = bmp_info.bmWidth;   h = bmp_info.bmHeight;   hdc_mem = CreateCompatibleDC(hdc);   SelectObject(hdc_mem,hBmp);   BitBlt(hdc,0,0,w,h,hdc_mem,0,0,SRCCOPY);   DeleteDC(hdc_mem);   DeleteObject(hBmp);   EndPaint(hWnd,&ps);   break; ******リソース(img.rc)****** // // Bitmap // IDB_BITMAP1 BITMAP DISCARDABLE "bitmap1.bmp" #ifdef APSTUDIO_INVOKED

  • Win32APIにて、簡易タイピングソフトを作成したのですが、うまく実行されません。

    いつもお世話になっております。 小生、只今、WinXPSP3上でC言語とWin32APIを使用し、BCC5.5.1でコンパイルしながらWindowsプログラミングを勉強しています。 今回、質問させて頂きたいのは、「猫でもわかるWindowsプログラミング第2版」の第5章簡易タイピングソフトを作るの回で、掲載されてあったコードを自分なりに改造して、実行してみたのですが、ウィンドウが起動しても、真っ白の状態でタイピングの問題が出題されないようになってしまいました。 以下にコードを掲載致します。 ※文字数制限にひっかかったので、改造した部分だけを掲載させて頂きます。 #include <windows.h> #include <time.h> #pragma comment(lib, "winmm.lib") LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE, LPCSTR); BOOL InitInstance(HINSTANCE, int, LPCSTR); DWORD TypeStart(HWND, char*); //ウィンドウの生成 BOOL InitInstance(HINSTANCE hInst, int nCmdShow, LPCSTR szClassName) { HWND hWnd; hWnd = CreateWindow( szClassName, "EasyTyping", 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) { HDC hdc; PAINTSTRUCT ps; MMTIME mm; char szMondai[32] = {0}; char szInput[32] = {0}; char szCheck[32] = {0}; DWORD dwStart, dwEnd; BOOL bStart = FALSE, bSeikai = TRUE; switch(msg){ case WM_CREATE: srand((unsigned)time(NULL)); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); TextOut(hdc, 0, 0, szMondai, (int)strlen(szMondai)); TextOut(hdc, 0, 40, szInput, (int)strlen(szInput)); if(bSeikai == TRUE){ SetTextColor(hdc, RGB(0, 0, 0)); } else{ SetTextColor(hdc, RGB(255, 0, 0)); } TextOut(hdc, 0, 80, szCheck, (int)strlen(szCheck)); EndPaint(hWnd, &ps); break; case WM_CHAR: if(wp == VK_SPACE && !bStart){ bStart = TRUE; dwStart = TypeStart(hWnd, szMondai); break; } if(bStart == FALSE){ return DefWindowProc(hWnd, msg, wp, lp); } if(wp == VK_ESCAPE){ strcpy(szMondai, ""); strcpy(szInput, ""); strcpy(szCheck, ""); InvalidateRect(hWnd, NULL, TRUE); bStart = FALSE; break; } wsprintf(szInput, "あなたの入力 = \"%c\"", (int)wp); if(szMondai[6] == szInput[14]){ bSeikai = TRUE; mm.wType = TIME_MS; timeGetSystemTime(&mm, sizeof(MMTIME)); dwEnd = mm.u.ms; wsprintf(szCheck, "反応時間[%dミリ秒]", dwEnd - dwStart); dwStart = TypeStart(hWnd, szMondai); } else{ bSeikai = FALSE; MessageBeep(MB_OK); strcpy(szCheck, "タイプミス!"); } InvalidateRect(hWnd, NULL, TRUE); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, msg, wp, lp); } return 0; } DWORD TypeStart(HWND hWnd, char *p_szMondai) { int n; MMTIME mm; n = rand() % 26; wsprintf(p_szMondai, "問題 = \"%c\"", 'a' + n); mm.wType = TIME_MS; timeGetSystemTime(&mm, sizeof(MMTIME)); InvalidateRect(hWnd, NULL, TRUE); return mm.u.ms; } #endif 以上です。 掲載されているコードは余りにもグローバル変数が多く、 自分自身余り、グローバル変数は好きではないので、関数内で収まるようにと改造したのですが。。。 お忙しい中、申し訳ございませんが、先輩方、アドバイス宜しくお願い致します。

  • 指定の開発環境を導入しても解決できません。

    以前、猫でもわかるゲームプログラミングで、 付録のプログラム「外部ファイルの画像を表示する」 をコンパイルした時にエラーが起きると質問しましたが、 その時の解答「指定の開発環境を導入する」を行い、 コンパイルした所、以下のエラーが出てきました。 その時のプログラムがこちら。 // bmp02.cpp #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); char szClassName[] = "bmp02"; //ウィンドウクラス HINSTANCE hInst; int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; BOOL bRet; hInst = hCurInst; 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; 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) { HWND hWnd; hWnd = CreateWindow(szClassName, "猫でもわかるゲームプログラミング", //タイトルバーに表示されます WS_OVERLAPPEDWINDOW, //ウィンドウの種類 CW_USEDEFAULT, //X座標 CW_USEDEFAULT, //Y座標 CW_USEDEFAULT, //幅 CW_USEDEFAULT, //高さ NULL, //親ウィンドウのハンドル、親を作るときはNULL 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) { int id, i, j; static int bmpw, bmph; static HDC hdc_mem; static HBITMAP hBmp; BITMAP bmp_info; HDC hdc; PAINTSTRUCT ps; RECT rc; switch (msg) { case WM_CREATE: hBmp = (HBITMAP)LoadImage(NULL, "cat.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); GetObject(hBmp, (int)sizeof(bmp_info), &bmp_info); bmpw = bmp_info.bmWidth; bmph = bmp_info.bmHeight; hdc_mem = CreateCompatibleDC(NULL); SelectObject(hdc_mem, hBmp); break; case WM_PAINT: GetClientRect(hWnd, &rc); hdc = BeginPaint(hWnd, &ps); for (i = 0; i * bmpw <= rc.right; i++) { for (j = 0; j * bmph <= rc.bottom; j++) { BitBlt(hdc, i * bmpw, j * bmph, bmpw, bmph, hdc_mem, 0, 0, SRCCOPY); } } EndPaint(hWnd, &ps); break; case WM_CLOSE: id = MessageBox(hWnd, "終了してもよろしいですか", "確認", MB_YESNO | MB_ICONQUESTION); if (id == IDYES) DestroyWindow(hWnd); break; case WM_DESTROY: DeleteObject(hBmp); DeleteDC(hdc_mem); PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; }

専門家に質問してみよう