6.1 色選択ダイアログ (3) プログラム例 以下のプログラムでは,左ボタンをクリックしたら色選択ダイアログボックスを表示し,ダイアログボックスで「OK」ボタンをクリックしたら,選択された色指定を16進数で表示します。 第2章で示す各種の描画と組み合わせて図形の色を変更することもできますので,ぜひチャレンジしてください。 #include "myWin.h" void procLButtonDown(HWND hw, WPARAM wp,LPARAM lp){ CHOOSECOLOR CC;COLORREF CustC[16];TCHAR str[128]; CC.lStructSize=sizeof(CHOOSECOLOR); CC.hwndOwner=hw; CC.hInstance=0; CC.lpCustColors = CustC; CC.Flags=CC_ANYCOLOR; if(ChooseColor(&CC)){ wsprintf(str,TEXT(" %08X"),CC.rgbResult); MessageBox(hw,str,TEXT("色指定"),MB_OK); } } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ;return 0; case WM_LBUTTONUP: procLButtonDown(hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } 6.2 フォント選択ダイアログ (3) プログラム例 #include "myWin.h" void procLButtonDown(HWND hw, WPARAM wp,LPARAM lp){ CHOOSEFONT CC;COLORREF CustC[16];TCHAR str[128];LOGFONT logfont; CC.lStructSize = sizeof(CHOOSEFONT); CC.hwndOwner = hw ; CC.hInstance = 0 ; CC.lpLogFont = &logfont; CC.rgbColors=0 ; CC.Flags = CF_BOTH|CF_EFFECTS; if(ChooseFont(&CC)){ wsprintf(str,TEXT(" %08X Name=\"%s\" Bold=%08X "), CC.iPointSize,logfont.lfFaceName, logfont.lfWeight); MessageBox(hw,str,TEXT("フォント選択"),MB_OK); } } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ;return 0; case WM_LBUTTONUP: procLButtonDown(hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } 6.3 ファイル関連ダイアログ (3) プログラム例 #include "myWin.h" static OPENFILENAME CC; static TCHAR strFile[2048],strFileTitle[128]; static TCHAR sFilter[]=TEXT("Text Files\0*.txt\0All Files\0*.*\0"); void procLButtonDown(HWND hw, WPARAM wp,LPARAM lp){ CC.lStructSize =sizeof(OPENFILENAME); CC.hwndOwner =hw ; CC.hInstance =hInstance; CC.lpstrFilter =sFilter ; CC.nFilterIndex =1; CC.lpstrCustomFilter=NULL ; CC.nMaxCustFilter=0; CC.lpstrFile =strFile ; CC.nMaxFile =2048; CC.lpstrFileTitle =strFileTitle; CC.nMaxFileTitle =128; CC.lpstrInitialDir =TEXT("D:\\"); CC.lpstrTitle =TEXT("テストだよ"); CC.lpstrDefExt =TEXT("txt") ; CC.Flags =0; if(GetOpenFileName(&CC)) // GetSaveFileName(&CC)に変更すると保存 MessageBox(hw,CC.lpstrFile,TEXT("ファイルを開くダイアログ"),MB_OK); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ;return 0; case WM_LBUTTONUP: procLButtonDown(hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } (4) 複数ファイルの指定 #include "myWin.h" static OPENFILENAME CC; static TCHAR strFile[2048],strFileTitle[128]; static TCHAR sFilter[]=TEXT("Text Files\0*.txt\0All Files\0*.*\0"); void seperate(HWND hw, TCHAR str[]){ TCHAR prStr[2048];int i; for(i=0; str[i]!=0||str[i+1]!=0; i++){ if(str[i]==0) prStr[i]=TCHAR('\n'); else prStr[i]=str[i]; } prStr[i]=0; MessageBox(hw,prStr,TEXT("複数選択確認"),MB_OK); } void procLButtonDown(HWND hw, WPARAM wp,LPARAM lp){ CC.lStructSize =sizeof(OPENFILENAME); CC.hwndOwner =hw ; CC.hInstance =hInstance; CC.lpstrFilter =sFilter ; CC.nFilterIndex =1; CC.lpstrCustomFilter=NULL ; CC.nMaxCustFilter=0; CC.lpstrFile =strFile ; CC.nMaxFile =2048; CC.lpstrFileTitle =strFileTitle; CC.nMaxFileTitle =128; CC.lpstrInitialDir =TEXT("D:\\"); CC.lpstrTitle =TEXT("テストだよ"); CC.lpstrDefExt =TEXT("txt") ; CC.Flags =OFN_ALLOWMULTISELECT|OFN_EXPLORER; if(GetOpenFileName(&CC)) seperate(hw, CC.lpstrFile); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ;return 0; case WM_LBUTTONUP: procLButtonDown(hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } 6.4 印刷関連ダイアログ (3) ページ設定ダイアログのプログラム例 #include "myWin.h" static PAGESETUPDLG psd; static TCHAR str[2048]=TEXT(""); void procCreate(HWND hw, WPARAM wp,LPARAM lp){ psd.lStructSize = sizeof(PAGESETUPDLG); psd.hwndOwner = hw; psd.Flags=PSD_INHUNDREDTHSOFMILLIMETERS; } void procLButtonDown(HWND hw, WPARAM wp,LPARAM lp){ if(PageSetupDlg(&psd)){ wsprintf(str,TEXT("\n幅 = %d\n高さ = %d\nマージン = %d %d, %d,%d"), psd.ptPaperSize.x , psd.ptPaperSize.y , psd.rtMargin.top , psd.rtMargin.right, psd.rtMargin.bottom, psd.rtMargin.left); MessageBox(hw,str,TEXT("ページ設定"),MB_OK); } } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ;return 0; case WM_LBUTTONUP: procLButtonDown(hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } ? (6) 印刷ダイアログのプログラム例 #include "myWin.h" static PRINTDLG pd; static BCHAR *strName;TCHAR str[256]; void procCreate(HWND hw, WPARAM wp,LPARAM lp){ pd.lStructSize = sizeof(PRINTDLG); pd.hwndOwner=hw; pd.Flags=PD_RETURNDC; } void procLButtonDown(HWND hw, WPARAM wp,LPARAM lp){ if(PrintDlg(&pd)){ if(pd.hDevMode){ strName=(BCHAR *)GlobalLock(pd.hDevMode); MessageBox(hw,strName,TEXT("印刷ダイアログ"),MB_OK); GlobalUnlock(pd.hDevMode); } } } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ;return 0; case WM_LBUTTONUP: procLButtonDown(hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } 6.5 検索と置換ダイアログ (3) 検索ダイアログ表示のプログラム例 #include "myWin.h" #define andTF(A) fr.Flags & A ? TEXT("True"): TEXT("False") static FINDREPLACE fr; static UINT uMessage; TCHAR strFind[128], strMsg[1024]; void procCreate(HWND hw, WPARAM wp,LPARAM lp){ uMessage = RegisterWindowMessage(FINDMSGSTRING); fr.lStructSize = sizeof(FINDREPLACE); fr.hwndOwner = hw; fr.Flags = FR_MATCHCASE; fr.lpstrFindWhat = strFind; fr.wFindWhatLen=128; FindText(&fr); } void procFind(HWND hw, WPARAM wp,LPARAM lp){ wsprintf(strMsg,TEXT("検索文字列 : \"%s\"\n") TEXT("単語単位で探す : %s\n") TEXT("大/小文字の区別: %s\n") TEXT("上から下に : %s\n"), fr.lpstrFindWhat , andTF(FR_WHOLEWORD), andTF(FR_MATCHCASE), andTF(FR_DOWN)); MessageBox(hw,strMsg,TEXT("検索条件"),MB_OK); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ if(msg==uMessage && !(fr.Flags & FR_DIALOGTERM)){ procFind(hw,wp,lp); return 0; } switch(msg){ case WM_DESTROY : PostQuitMessage(0) ;return 0; case WM_CREATE : procCreate (hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } (4) 置換ダイアログ表示のプログラム例 #include "myWin.h" #define andTF(A) fr.Flags & A ? TEXT("True"): TEXT("False") static FINDREPLACE fr; static UINT uMessage; TCHAR strFind[128], strRep[128],strMsg[1024]; void procCreate(HWND hw, WPARAM wp,LPARAM lp){ uMessage = RegisterWindowMessage(FINDMSGSTRING); fr.lStructSize = sizeof(FINDREPLACE); fr.hwndOwner = hw ; fr.Flags = FR_MATCHCASE; fr.lpstrFindWhat =strFind; fr.lpstrReplaceWith = strRep; fr.wReplaceWithLen = fr.wFindWhatLen = 128; ReplaceText(&fr); } void procFind(HWND hw, WPARAM wp,LPARAM lp){ wsprintf(strMsg,TEXT("検索文字列 : \"%s\"\n") TEXT("置換文字列 : \"%s\"\n") TEXT("単語単位で探す : %s\n") TEXT("大/小文字の区別: %s\n") TEXT("処理 : %s\n"), fr.lpstrFindWhat , fr.lpstrReplaceWith, andTF(FR_WHOLEWORD), andTF(FR_MATCHCASE), fr.Flags & FR_FINDNEXT? TEXT("次を検索") : fr.Flags & FR_REPLACE ? TEXT("置換して次へ"):TEXT("すべて置換")); MessageBox(hw,strMsg,TEXT("検索条件"),MB_OK); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ if(msg==uMessage && !(fr.Flags & FR_DIALOGTERM)){ procFind(hw,wp,lp); return 0; } switch(msg){ case WM_DESTROY : PostQuitMessage(0) ;return 0; case WM_CREATE : procCreate (hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } 6.6 カスタムダイアログ (2) 裸のダイアログ 【リソースファイル】 /* diag1.rc */ #include "Windows.h" HANAKO DIALOG 10,10,100,30 FONT 16,"MS Shell Dlg" STYLE WS_CAPTION | WS_BORDER | WS_SYSMENU CAPTION "裸のダイアログ" { } 【ソースプログラム】 #include "myWin.h" BOOL CALLBACK DialogProc(HWND hw,UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_CLOSE : EndDialog(hw, IDOK) ;return TRUE; } return FALSE; } void procLButtonUp(HWND hw, WPARAM wp,LPARAM lp){ DialogBox(hInstance, TEXT("HANAKO"), hw,DialogProc); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ;return 0; case WM_LBUTTONUP: procLButtonUp (hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } (3) メニューを持つダイアログ 【リソースファイル】 /* diag1.rc */ #include "Windows.h" TARO MENU { POPUP "少年" { MENUITEM "しろう", 40001 MENUITEM "たろう", 40002 MENUITEM "じろう", 40003 } } HANAKO DIALOG 10,10,100,30 FONT 16,"MS Shell Dlg" STYLE WS_CAPTION | WS_BORDER | WS_SYSMENU CAPTION "メニューを持つ例" MENU TARO {} (5) LTEXT・EDITTEXT・PUSHBOTTONの使用 【リソースファイル】 /* diag2.rc */ #include "Windows.h" HANAKO DIALOG 10,10,200,100 FONT 10,"MS Shell Dlg" STYLE WS_CAPTION | WS_BORDER | WS_SYSMENU CAPTION "テキスト,エディット,ボタンを持つ例" { LTEXT "選択された文字列",4001, 10, 5, 100, 50 EDITTEXT 4002, 10, 30, 150, 50, ES_AUTOHSCROLL |ES_AUTOVSCROLL |ES_MULTILINE PUSHBUTTON "取得" ,4003, 20, 15, 30, 15 } 【ソースプログラム】 #include "myWin.h" static HWND hEdit; static TCHAR str[]=TEXT("しののめちかき汽車の窓より外をながむれば\r\n") TEXT("ところもしらぬ山里へ\r\n") TEXT("さも白く咲きてゐたるをだまきの花\r\n") TEXT("\r\n 萩原朔太郎『夜汽車』より\r\n"); static DWORD dwST; LPARAM lpED;static TCHAR msgStr[128]; void initDialog(HWND hw, WPARAM wp,LPARAM lp){ hEdit=GetDlgItem(hw,4002); SetWindowText(hEdit,str);// SetDlgItemText(hw,4002,str);でもよい。 } void diaProcCommand(HWND hw, WPARAM wp,LPARAM lp){ switch(LOWORD(wp)){ case 4003:SendMessage(hEdit,EM_GETSEL,(WPARAM)&dwST, LPARAM)&lpED); wsprintf(msgStr,TEXT(" %d to %d"), dwST, lpED); MessageBox(hw,msgStr,TEXT("選択文字列の位置"),MB_OK); } } BOOL CALLBACK DialogProc(HWND hw,UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_CLOSE : EndDialog(hw, IDOK) ;return TRUE; case WM_INITDIALOG: initDialog(hw,wp,lp) ;return TRUE; case WM_COMMAND : diaProcCommand(hw,wp,lp);return TRUE; } return FALSE; } void procLButtonUp(HWND hw, WPARAM wp,LPARAM lp){ DialogBox(hInstance, //(HINSTANCE)GetWindowLong(hw,GWL_HINSTANCE), TEXT("HANAKO"), hw,DialogProc); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ;return 0; case WM_LBUTTONUP: procLButtonUp (hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } (6) ボタンコントロール 【リソースファイル】(/* diag3.rc */ HANAKO DIALOG 10,10,80,50 FONT 12,"MS Shell Dlg" CAPTION "ボタンを使う" { RADIOBUTTON "淳子",1,10,10,40,10 RADIOBUTTON "詩織",2,10,20,40,10 RADIOBUTTON "由香",3,10,30,40,10 } 【ソースプログラム】 #include "myWin.h" void procDlgCommand(HWND hw, WPARAM wp,LPARAM lp){ for(int i=1;i<4;i++) SendDlgItemMessage(hw,i,BM_SETCHECK,i==LOWORD(wp),0); } BOOL CALLBACK DialogProc(HWND hw,UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_CLOSE : EndDialog(hw, IDOK) ;return TRUE; case WM_COMMAND : procDlgCommand(hw,wp,lp);return TRUE; } return FALSE; } //(以下,procLButtonUp以降は前節(5)と同じため省略) ■関数の使用例 【リソースファイル】(/* diag4.rc */ #include "Windows.h" HANAKO DIALOG 10,10,80,80 FONT 12,"MS Shell Dlg" CAPTION "ボタンを使う" { RADIOBUTTON "淳子", 1,10,10,40,10 RADIOBUTTON "詩織", 2,10,20,40,10 RADIOBUTTON "由香", 3,10,30,40,10 CHECKBOX "東京",11,10,50,40,10 CHECKBOX "大阪",12,10,60,40,10 } 【ソースプログラム】 #include "myWin.h" void procDlgCommand(HWND hw, WPARAM wp,LPARAM lp){ unsigned int ch=LOWORD(wp); if(ch<4) CheckRadioButton(hw,1,3,ch); else if(ch==11 || ch==12) CheckDlgButton(hw, ch, !(IsDlgButtonChecked(hw,ch)==BST_CHECKED)); } BOOL CALLBACK DialogProc(HWND hw,UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_CLOSE : EndDialog(hw, IDOK) ;return TRUE; case WM_COMMAND : procDlgCommand(hw,wp,lp);return TRUE; } return FALSE; } (7) コントロールからメッセージを受け取る 【リソースファイル】(/* diag5.rc */ #include "Windows.h" /* IDOK, IDCANCELを使っているのでこれを入れる*/ HANAKO DIALOG 10,10,80,40 FONT 12,"MS Shell Dlg" CAPTION "IDを返す" { LTEXT "終了しますか?", -1,5,5,100,20 PUSHBUTTON "OK", IDOK, 10, 20, 20, 10 PUSHBUTTON "Cancel", IDCANCEL, 40, 20, 30, 10 } 【ソースプログラム】 #include "myWin.h" void procDlgCommand(HWND hw, WPARAM wp,LPARAM lp){ unsigned int ch=LOWORD(wp); if(ch==IDOK || ch== IDCANCEL) EndDialog(hw,ch); } BOOL CALLBACK DialogProc(HWND hw,UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_CLOSE : EndDialog(hw, IDCANCEL) ;return TRUE; case WM_COMMAND : procDlgCommand(hw,wp,lp);return TRUE; } return FALSE; } void procClose(HWND hw, WPARAM wp,LPARAM lp){ if(DialogBox(hInstance, TEXT("HANAKO"), hw,DialogProc)==IDOK) DestroyWindow(hw); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY: PostQuitMessage(0) ;return 0; case WM_CLOSE : procClose(hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } (8) ポップアップなダイアログ 【リソースファイル】(/* diag6.rc */ #include "Windows.h" HANAKO DIALOG 10,10,120,40 FONT 12,"MS Shell Dlg" STYLE WS_VISIBLE | WS_POPUPWINDOW CAPTION "モードレス" { CTEXT "モードレスなダイアログ",1,10,10,100,20 CTEXT "表示テスト",2,10,20,100,20 } 【ソースプログラム】 #include "myWin.h" static HWND hdlg=NULL; BOOL CALLBACK DialogProc(HWND hw,UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_CLOSE : DestroyWindow(hdlg);hdlg=NULL ;return TRUE; } return FALSE; } void procLButtonUp(HWND hw, WPARAM wp,LPARAM lp){ if(!hdlg) hdlg=CreateDialog(hInstance,TEXT("HANAKO"), hw,DialogProc); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ;return 0; case WM_LBUTTONUP : procLButtonUp(hw,wp,lp);return 0; case WM_RBUTTONUP : MessageBox(hw,TEXT("右ボタンが押されました"), TEXT("モーダレステスト"),MB_OK);return 0; } return DefWindowProc(hw,msg,wp,lp); } 【myWin.h内のWinMain】 int WINAPI WinMain(HINSTANCE hCurI, HINSTANCE hPreI, PSTR lp, int cmd){ MSG msg; if(!initApp(hCurI)) return 0; if(initInst(hCurI)==NULL) return 0; while(GetMessage(&msg,NULL,0,0)){ if(hdlg && IsDialogMessage(hdlg, &msg)) continue; TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } (9) ダイアログウィンドウ 【リソースファイル】(/* diag7.rc */ #include "Windows.h" HANAKO DIALOG 10,10,120,40 FONT 12,"MS Shell Dlg" STYLE WS_VISIBLE | WS_POPUPWINDOW CLASS "HANAKO" CAPTION "Dialog Application" { CTEXT "ダイアログウィンドウ",1,10,10,100,20 PUSHBUTTON "OK",IDOK,10,20,100,20 } 【ソースプログラム】 #include "myWin.h" void procCommand(HWND hw, WPARAM wp,LPARAM lp){ if(LOWORD(wp)==IDOK) SendMessage(hw,WM_CLOSE,0,0); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY: PostQuitMessage(0) ;return 0; case WM_COMMAND: procCommand(hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); } 【myWin.h内関数】 BOOL initApp(HINSTANCE hCurI){ WNDCLASS wc;hInstance = hCurI; wc.style = CS_HREDRAW | CS_VREDRAW|CS_DBLCLKS; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = DLGWINDOWEXTRA;//ダイアログウィンドウのとき wc.hInstance = hCurI; wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("HANAKO"); return RegisterClass(&wc); } HWND initInst(HINSTANCE hCurI){ Return CreateDialog(hCurI,TEXT("HANAKO"),0,NULL); }(以下,WinMain省略) 6.7 アイコン (1) プログラムのアイコン 【リソースファイル】(myIcon.rc) MYICON ICON "myIcon.ico" 【ソースプログラム】(以下,initAPPだけを示す) BOOL initApp(HINSTANCE hCurI){ WNDCLASS wc; hInstance=hCurI; wc.style = CS_HREDRAW | CS_VREDRAW|CS_DBLCLKS; wc.lpfnWndProc = WndProc; wc.cbClsExtra = wc.cbWndExtra=0; wc.hInstance = hCurI; wc.hIcon = LoadIcon(hCurI,TEXT("MYICON")); wc.hCursor = LoadCursor(hCurI,IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("クラス名"); return RegisterClass(&wc); } ? (2) コントロールとしてのアイコン使用 【リソースファイル】 MYICON ICON "myIcon.ico" HANAKO DIALOG 10, 10, 100,50 FONT 12,"MS Shell Dlg" CAPTION "ICONの配置"{ ICON "MYICON", 1001, 10,10, 0, 0 } 【ソースプログラム】 #include "myWin.h" BOOL CALLBACK DialogProc(HWND hw,UINT msg, WPARAM wp,LPARAM lp){ TCHAR str[128]; switch(msg){ case WM_CLOSE : EndDialog(hw, IDOK) ;return TRUE; case WM_LBUTTONUP: int x=LOWORD(lp), y=HIWORD(lp); if(x>24 && x<56 && y>20 && y<54) MessageBox(hw,TEXT("アイコン選択"),TEXT("アイコン配置"),MB_OK); return TRUE; } return FALSE; } void procLButtonUp(HWND hw, WPARAM wp,LPARAM lp){ DialogBox(hInstance, TEXT("HANAKO"), hw,DialogProc); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ;return 0; case WM_LBUTTONUP: procLButtonUp (hw,wp,lp);return 0; } return DefWindowProc(hw,msg,wp,lp); }