• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:構造体の一度のメンバを保持)

構造体の一度のメンバを保持する方法

このQ&Aのポイント
  • 自作関数内でローカルな構造体の一部のメンバを一度だけ指定し、以降はその設定が有効になるようにする方法を教えてください。
  • 処理速度を向上させるため、自作関数の中で変化のある4つのメンバ(hwndOwner、hDC、lpLogFont、rgbColors)だけを書き換える方法はありますか?
  • 関数内で構造体の一部のメンバを保持し、その値を使用して処理を行う方法を教えてください。

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

  • ベストアンサー
  • gimmick
  • ベストアンサー率49% (134/270)
回答No.2

>このような方法をとっているソースはどこかのサイトで公開されていませんか? ちょっと思い出せません。ごめんなさい。 それから、質問の後者の関数の場合、固定パラメータを誤って変更してしまうと元に戻りません。(初期化する処理を付け加えない限り) 若干注意が必要かもしれませんね。

basukento
質問者

お礼

そうですか。あってもおかしくないソースだと思うけど見かけませんね。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • gimmick
  • ベストアンサー率49% (134/270)
回答No.1

「CHOOSEFONT cf」としているので「cf->」は「cf.」の間違いだと思いますが、それ以外は特に問題無いように思います。もっとも、処理速度がどれほどアップするのかは疑問ですが...。

basukento
質問者

補足

考え方は間違ってなかったんですね。 これで速くなったという違いが感じられるほどではないと思うんですが、 このような方法をとっているソースはどこかのサイトで公開されていませんか? 普通は質問のソースの前者の形ですよね。 メンバのアクセス方法がアローになっていましたね。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C++/CLIで印刷する画像が表示されない

    filenameで指定したbmpファイルを印刷させるプログラムを作っているのですが、 どうやっても指定したファイル名のアドレスの画像が表示されなくて困っています。 どうやったら良いのでしょうか?? bool printFile(char *filename) { PRINTDLG pd; DOCINFO di; HWND hWnd; HDC hBuffer; static HBITMAP hBitmap; //プリンタの設定 memset(&pd, 0, sizeof(PRINTDLG)); pd.lStructSize = sizeof(PRINTDLG); pd.hwndOwner = NULL; pd.hDevMode = NULL; pd.hDevNames = NULL; pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC | PD_NOPAGENUMS | PD_NOSELECTION | PD_HIDEPRINTTOFILE| PD_RETURNDEFAULT; pd.nCopies = 1; pd.nFromPage = 1; pd.nToPage = 1; pd.nMinPage = 1; pd.nMaxPage = 1; memset(&di, 0, sizeof(DOCINFO)); di.cbSize = sizeof(DOCINFO); di.lpszDocName = filename; //印刷を実行 if (PrintDlg(&pd)==TRUE) { StartDoc(pd.hDC, &di); StartPage(pd.hDC); //描画を実行 int lnWidth = 2000; int lnHeight = 5000; HDC hMemDC = CreateCompatibleDC(pd.hDC); HBITMAP hBitmap = CreateCompatibleBitmap(pd.hDC,lnWidth,lnHeight); HBITMAP Obj = (HBITMAP)SelectObject(hMemDC,hBitmap); int iRet = GetDeviceCaps(hMemDC,RASTERCAPS); // コピー iRet = BitBlt(hMemDC,0,0,lnWidth,lnHeight,pd.hDC,0,0,SRCCOPY); EndPage(pd.hDC); EndDoc(pd.hDC); DeleteDC(pd.hDC); return true; } return false; }

  • WriteFile関数

    WriteFile関数 C言語でWindowsプログラミングを学習中です。 2点ご質問です。 LPTSTR型のbufferには(1)のように文字列を格納して、 画面に表示しています。 ファイルに保存するために改行は「\r\n」に置き換えているので、 画面上ではもちろん改行されません。 Editコントロールを使用すれば簡単にいくと思いますが、 このような方法で画面上にも改行・ファイルにも改行という方法はありますか? さらに(2)で保存したファイルを開くと文字と文字の間に半角のスペースが 入ってしまいます。 ごくたまに入らない時もありますが、文字列の一部しか表示されません。 これはUNICODEとマルチバイトの関係なのでしょうか? UNICODEを定義しています。 マルチバイトを定義してしまうとGetSaveFileName関数が エラーになってしまうので・・・ ご教授お願いします。 (1) case WM_CHAR: if(wp==VK_BACK){ if(!iCount) return 0; iCount--; InvalidateRect(hWnd,NULL,TRUE); }else if(wp==VK_RETURN){ buffer[iCount++]='\r\n'; InvalidateRect(hWnd,NULL,TRUE); return 0; }else{ buffer[iCount++]=(TCHAR)wp; InvalidateRect(hWnd,NULL,TRUE); } return 0; case WM_PAINT: hdc=BeginPaint(hWnd,&ps); GetClientRect(hWnd,&rc); DrawText(hdc,buffer,iCount,&rc,DT_WORDBREAK); EndPaint(hWnd,&ps); return 0; ・ ・ ・ ・ (2) int MySave(LPTSTR buffer,HWND hWnd) { OPENFILENAME ofn; HANDLE hFile; TCHAR szFile[MAX_PATH]; TCHAR szFileTitle[MAX_PATH]; DWORD dwAccBytes; memset(&ofn,0,sizeof(OPENFILENAME)); ofn.lStructSize=sizeof(OPENFILENAME); ofn.hwndOwner=hWnd; ofn.lpstrFilter=TEXT("text(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0"); ofn.lpstrFile=szFile; ofn.lpstrFileTitle=szFileTitle; ofn.nFilterIndex=1; ofn.nMaxFile=MAX_PATH; ofn.nMaxFileTitle=MAX_PATH; ofn.Flags=OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY; ofn.lpstrDefExt=TEXT("txt"); ofn.lpstrTitle=TEXT("名前を付けて保存"); if(!GetSaveFileName(&ofn)) return -1; hFile=CreateFile(szFile,GENERIC_WRITE,0,NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); WriteFile(hFile,buffer,(DWORD)lstrlen(buffer), &dwAccBytes,NULL); SetWindowText(hWnd,szFileTitle); CloseHandle(hFile); return 0; }

  • 呼び出し時のパラメータが足りない

    自作関数windowcaputureを作成して、 他のmain関数でその関数を呼び出すと "呼び出し時のパラメータが足りない"とエラーがでます。 この自作関数のみでコンパイルすると (windowcaputure → main関数と名前を変更し) きちんと動作することは確認しています。 以下、ソースを載せています。 原因がわかる方、アドバイスお願いします。 void SaveBitmap(HWND hWnd, LPCTSTR sFileName) { HANDLE hFile; HDC hDc, hDcBuf; LPBITMAPFILEHEADER lpHead; LPBITMAPINFOHEADER lpInfo; LPBYTE lpBuf, lpPixel; RECT cRect; HBITMAP hBmp, hOldBmp; DWORD nWriteSize, nFileSize, nWidth, nHeight, nLength; GetClientRect(hWnd, &cRect); // 画面サイズの取得 /* クライアント領域取得 */ nWidth = cRect.right; //幅 nHeight = cRect.bottom; //高さ if( ( nWidth * 3 ) % 4 == 0 ) // ライン長を計算 { nLength = nWidth * 3; } else{ nLength = nWidth * 3 + ( 4 - ( nWidth * 3 ) % 4 ); } nWidth=518; nHeight=610; // ファイルサイズの計算 nFileSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nLength * nHeight; // 一時メモリの確保と各種情報のセット lpBuf = (LPBYTE)GlobalAlloc(GPTR, nFileSize); // バッファの確保 lpHead = (LPBITMAPFILEHEADER)lpBuf; // ファイルヘッダ情報 lpInfo = (LPBITMAPINFOHEADER)(lpBuf + sizeof(BITMAPFILEHEADER));//その他情報 lpPixel = lpBuf + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//ピクセルの取得 // ビットマップ情報のセット lpHead->bfType = 'M' * 256 + 'B'; lpHead->bfSize = nFileSize; lpHead->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); lpInfo->biSize = sizeof(BITMAPINFOHEADER); lpInfo->biHeight = nHeight; lpInfo->biWidth = nWidth; lpInfo->biBitCount = 24; lpInfo->biPlanes = 1; // DCの取得とBMP情報のセット hDc = GetDC(hWnd); // DCの取得 hBmp = CreateCompatibleBitmap(hDc, nWidth, nHeight); // ウインドウのデバイスコンテキスト互換のBITMAP作成 */ hDcBuf = CreateCompatibleDC( hDc ); // DC互換のDCバッファを作成 // BMPのコピー hOldBmp = (HBITMAP)SelectObject( hDcBuf, hBmp ); // 旧BMPの待避 BitBlt( hDcBuf, 0, 0, nWidth=518, nHeight=620, hDc,16,32, SRCCOPY ); // ビットマップのコピー SelectObject( hDcBuf, hOldBmp ); // 旧BMPの復元 GetDIBits( hDc, hBmp, 0, nHeight, lpPixel, (LPBITMAPINFO)lpInfo, DIB_RGB_COLORS ); hFile = CreateFile( sFileName, GENERIC_WRITE, 0, NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL ); if( hFile != INVALID_HANDLE_VALUE ) { WriteFile( hFile, lpBuf, nFileSize, &nWriteSize, NULL ); // ファイルへの書き込み CloseHandle( hFile ); } ReleaseDC( hWnd, hDc ); // DCの解放 DeleteObject( hBmp ); DeleteObject( hDcBuf ); GlobalFree( lpBuf ); } BOOL CALLBACK EnumWndProc(HWND hWnd, LPARAM lParam) { WINDOWINFO wi; char szWindowName[ 128 ]; double caputuretime; wi.cbSize = sizeof(WINDOWINFO); GetWindowInfo(hWnd, &wi); if (wi.dwStyle & WS_VISIBLE) { GetClassName( hWnd, szWindowName, sizeof(szWindowName) ); if(strcmp(szWindowName,"ThunderRT6FormDC")==0){ //ウィンドウを前面にして書き直させる SetForegroundWindow(hWnd); Sleep(100); caputuretime = time(NULL); itoa(caputuretime , yy, 10);/* 10 は十進数変換 */ //キャプチャ習得時間をファイル名に strcat(yy, ".bmp"); SaveBitmap(hWnd,yy); } } return TRUE; } int windowcaputure(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow) { EnumWindows(EnumWndProc, 0);/*画面上のすべてのトップレベルウィンドウを列挙*/ return 0; }

  • 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 以上です。 掲載されているコードは余りにもグローバル変数が多く、 自分自身余り、グローバル変数は好きではないので、関数内で収まるようにと改造したのですが。。。 お忙しい中、申し訳ございませんが、先輩方、アドバイス宜しくお願い致します。

  • プログラムを実行して不具合の出たプリンタを直したい

    よろしくお願いします。 『印刷をするプログラム』を書いて実行した結果、 PCからのスキャン、プリンタ本体での、スキャン、コピーが出来なくなりました。 チェックディスク、システムの復元、ドライバーの入れ替え、などをしたのですが直りません。 多分、自作プログラムの実行により『プリンタ』か、『PC』のプログラムに、なんらかの異常が出たと思うのですが、プログラムを直せば良いのか、リカバリするのか、修復する方法が見つかりません。 詳しい方、アドバイスをよろしくお願いします。 自作のメモ帳にコーディングしたソースです。 //印刷関数 int MyPrint(HWND hWnd) { int i; PRINTDLG pd; DOCINFO di; TEXTMETRIC tm; char *lpszBuf = TEXT("ここが印刷される"); memset(&pd, 0, sizeof(PRINTDLG)); //PRINTDLG構造体の定義 pd.lStructSize = sizeof(PRINTDLG); pd.hwndOwner = hWnd; pd.hDevMode = NULL; pd.hDevNames = NULL; pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC | PD_NOPAGENUMS | PD_NOSELECTION | PD_HIDEPRINTTOFILE; pd.nMinPage = 1; pd.nMaxPage = 1; pd.nFromPage = 1; pd.nToPage = 1; pd.nCopies = 1; if(PrintDlg(&pd) == 0) return -1; memset(&di, 0, sizeof(DOCINFO)); //DOCINFO構造体の定義 di.cbSize = sizeof(DOCINFO); di.lpszDocName = TEXT("テスト"); StartDoc(pd.hDC, &di); //印刷ジョブ StartPage(pd.hDC); GetTextMetrics(pd.hDC, &tm); for(i = 0; i < 5; i++){ //< 50印刷部数 SetTextColor(pd.hDC, RGB(0, 0, 0)); TextOut(pd.hDC, 5, 5 + (tm.tmHeight * i + 20), lpszBuf, (int)strlen(lpszBuf)); /*for(i = 0; i < 5; i++){ SetTextColor(pd.hDC, RGB(255, 0, 0)); TextOut(pd.hDC, 5, 5 + (tm.tmHeight * i + 20), lpszBuf, (int)strlen(lpszBuf));*/ } EndPage(pd.hDC); EndDoc(pd.hDC); DeleteDC(pd.hDC); return 0; }

  • DialogBox

    こんばんは 最近Windowsプログラムでツールを作ることになりまして 久しぶりにダイアログボックスを作成しようとして、いきなり躓きました;; DialogBox関数でダイアログを表示できないのですが、何か特別な処理って必要でしたっけ? 以下ソースコードです #include <windows.h> #include "resource.h" BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow ) { DialogBox(hInstance, MAKEINTRESOURCE("IDD_DIALOG"), NULL, (DLGPROC)DialogProc); return 0; } BOOL CALLBACK DialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: // ダイアログボックスが作成されたとき return TRUE; case WM_CLOSE: EndDialog(hWnd, IDOK); return TRUE; } return FALSE; } よろしくお願いします

  • 画像を切り替えるプログラムで悩んでいます。

    C言語で、ビットマップを『2枚』表示した後、メニューの選択により、どちらかの画像だけを表示したいのです、色々試して見たのですが、うまく行きません。ヒント、アドバイスをお願いします。 本当は『2枚』だけでなく、スキャンして、保存した画像を全て表示したいのですが、まだその方法が出来ません。 1、グローバルな変数として、   HDC hdc_mem1, hdc_mem2;//2種類のメモリデバイスコンテキストハ  ンドルを格納  int show_no = 1;//画像選択のための変数1で初期化 2、/*ウィンドウプロシージャ*/ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { HDC hdc; static DWORD dwRop;   PAINTSTRUCT ps; HBITMAP hBmp; HDC hdc_memx; switch(msg){ case WM_CREATE: hdc = GetDC(hWnd); hdc_mem1, hdc_mem2; dwRop = SRCCOPY; hBmp = LoadBitmap(hInst, "MYBMP1"); if(hBmp == NULL){ MessageBox(hWnd, "画像1のロードに失敗しました", "エラー", MB_OK | MB_ICONWARNING); return 0; } hdc_mem1 = CreateCompatibleDC(hdc); SelectObject(hdc_mem1, hBmp); hBmp = LoadBitmap(hInst, "MYBMP2"); if(hBmp == NULL){ MessageBox(hWnd, "画像2のロードに失敗しました", "エラー", MB_OK | MB_ICONWARNING); return 0; } hdc_mem2 = CreateCompatibleDC(hdc); SelectObject(hdc_mem2, hBmp); ReleaseDC(hWnd, hdc); break; case WM_PAINT: BeginPaint(hWnd, &ps); hdc_memx = hdc_mem1, hdc_mem2; if(show_no == 1) hdc_memx = hdc_mem1; //変化なし hdc_memx != hdc_mem2;//変化なし if(show_no == 2) hdc_memx = hdc_mem2; /変化なし  hdc_memx != hdc_mem1;/変化なし BitBlt(ps.hdc, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top, hdc_mem1, ps.rcPaint.left, ps.rcPaint.top, dwRop); BitBlt(ps.hdc, 400,200, ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top, hdc_mem2, ps.rcPaint.left, ps.rcPaint.top, dwRop); EndPaint(hWnd, &ps); break; case WM_COMMAND: switch (LOWORD(wp)){ case IDM_PICT1: show_no = 1; InvalidateRect(hWnd, NULL, TRUE); break; case IDM_PICT2: show_no = 2; InvalidateRect(hWnd, NULL, TRUE); break; case IDM_SRCCOPY: dwRop = SRCCOPY; InvalidateRect(hWnd, NULL, TRUE); break; case IDM_NOTSRCCOPY: dwRop = NOTSRCCOPY; InvalidateRect(hWnd, NULL, TRUE); break; case IDM_SRCAND: dwRop = SRCAND; InvalidateRect(hWnd, NULL, TRUE); break; case IDM_SRCPAINT: dwRop = SRCPAINT; InvalidateRect(hWnd, NULL, TRUE); break; case IDM_END: SendMessage(hWnd, WM_CLOSE, 0, 0); break; } break; case WM_DESTROY: DeleteObject(hBmp); DeleteObject(hBmp); DeleteDC(hdc_mem1); DeleteDC(hdc_mem2); PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } 3、if文のところを色々と変えたのですが、うまく切り替わってくれません。   if(show_no == 1) hdc_memx = hdc_mem1; hdc_memx != hdc_mem2; if(show_no == 2) hdc_memx = hdc_mem2;  hdc_memx != hdc_mem1;

  • ウィンドウ枠をいちいち作るのがめんどくさい

    ウィンドウの作成の部分を書き出してみました。 BOOL InitInstance(HINSTANCE hInst,int nCmdShow) { HWND hWnd; hWnd=CreateWindow(szClassName, TEXT("文字列を表示する"); 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; } 毎回やるのはめんどくさいのでコピー&ペーストでもいいでしょうか? または、覚えた方がいいのでしょうか?

  • BitBlt関数について教えてください

    よろしくお願いします。 画像を読み込むための、BitBlt関数について、色々調べてみたのですが、どうしても分からない記述が2つあります。ご指導、アドバイスをお願いします。 1、サンプルのソースを参考にしているのですが、BitBlt関数の第2、第3の記述の意味として、 『PAINTSTRUCT構造体のポインタpsが、左隅上、を参照している』と解釈したのですが、第4、第5引数の、-(引く)の意味が理解できません。 2、画像を2種類表示するためメニューに、『オプション1とオプション2』を作り、オプション1はコピー元と同じ画像を表示、 オプション2は、ラスタオペレーションを選択可能にして、選択した画像を表示すると言うものですが、DWORD dwRop; を宣言し『第9引数をNOTSRCCOPY』として、二つ目の画像を表示する case文に dwRop = NOTSRCCOPY; を追加したのですがうまく行きません。多分 『dwRop』の使い方に問題があるのかと思うのですが、うまく表示されません。 因みに、 BitBlt関数の第9引数が『SRCCOPY』の時は、正常に2種類の画像が表示されます。 /*ウィンドウプロシージャ*/  LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)  { HDC hdc;  DWORD dwRop; //追加した  PAINTSTRUCT ps;  HBITMAP hBmp;  HDC hdc_memx;  switch(msg){  case WM_CREATE:  hdc = GetDC(hWnd);  hBmp = LoadBitmap(hInst, "MYBMP1");  if(hBmp == NULL){  MessageBox(hWnd, "画像1のロードに失敗しました", "エラー",  MB_OK | MB_ICONWARNING);  return 0;  }  hdc_mem1 = CreateCompatibleDC(hdc);  SelectObject(hdc_mem1, hBmp);  DeleteObject(hBmp);  hBmp = LoadBitmap(hInst, "MYBMP2");  if(hBmp == NULL){   MessageBox(hWnd, "画像2のロードに失敗しました", "エラー",   MB_OK | MB_ICONWARNING);  return 0;  } hdc_mem2 = CreateCompatibleDC(hdc);  SelectObject(hdc_mem2, hBmp);  DeleteObject(hBmp);  ReleaseDC(hWnd, hdc);  break;  case WM_PAINT:  BeginPaint(hWnd, &ps);  if(show_no == 1) hdc_memx = hdc_mem1;  if(show_no == 2) hdc_memx = hdc_mem2;  BitBlt(ps.hdc, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top, hdc_memx, ps.rcPaint.left, ps.rcPaint.top, SRCCOPY);  // PATCOPYにして,IDM_ANIME2に、dwRop=NOTSRCCOPY //を追加しても変更されないし、画像の表示が出来ない EndPaint(hWnd, &ps);  break; case WM_COMMAND: switch (LOWORD(wp)){ case IDM_ANIME1: show_no = 1;      //dwRop = SRCCOPY //追加したが変化なし InvalidateRect(hWnd, NULL, TRUE); break;  case IDM_ANIME2: show_no = 2; //dwRop = NOTSRCCOPY; //追加したが変化なし InvalidateRect(hWnd, NULL, TRUE); break;  case IDM_END: SendMessage(hWnd, WM_CLOSE, 0, 0); break; } break;  case WM_DESTROY: DeleteDC(hdc_mem1); DeleteDC(hdc_mem2); PostQuitMessage(0); break;  default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; }

  • ファイル名の取得について

    以下のサンプルで、選択したファイル名を任意の変数に取得したいのですが、どこに手を加えると取得できますでしょうか。 void OpenImgFiles(HWND hWnd) {   OPENFILENAME ofn;   memset(&ofn, 0, sizeof(OPENFILENAME));   ofn.lStructSize = sizeof(OPENFILENAME);   ofn.hwndOwner = hWnd;   ofn.lpstrFilter = "BMP files(*.bmp)\0*.bmp\0All Files(*.*)\0*.*\0\0";   ofn.lpstrFile = FileName;   ofn.nMaxFile = MAX_PATH;   ofn.Flags = OFN_FILEMUSTEXIST;   ofn.lpstrDefExt = "bmp";   ofn.nMaxFileTitle = 64;   ofn.lpstrFileTitle = FileTitle;   ofn.lpstrTitle = "ファイルを開く";   if (GetOpenFileName(&ofn)) {     show = 1;     InvalidateRect(hWnd, NULL, TRUE);   }   return; } ひょっとして簡単すぎるのかも知れませんが・・・ どうかよろしくお願いします。