|
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-// PR//-=-= ISIZE PC相談室オープン! ◆RECRUIT パソコン・ネットライフの「?」を解決!クチコミ評価もゲット! 〜〜1000万円が当る会員(無料)登録キャンペーン実施中!!〜〜 http://www.isize.com/pcsoudan/cgi-bin/count.cgi?melmel_c1 =-=-//000126-00637//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 発行部数:MagMag 2313 Pubzine 312 カプライト209 Melten 31 E-Magazine 54 ここでメール 146 Macky 153 Melma 224 総発行部数:3446 ▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼ ------------------------------------------------------------ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ■CからはじめるWindowsDirectXへの道 Vol33■ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┌─────────────────────────────┐ ■第2章 Windows(コンボボックス 編) └─────────────────────────────┘ さて、そろそろWindowsの情報処理方面のコントロールに 戻ります. 今回は,コンボボックス編として進めていきます. また、前回載せましたが,以下のコムズショップでは、 リンクスタッフも募集しています.最高額38万円もらった 人がいるらしいです。 ルータがほしいです! ┌─────────────────────────────┐ 電話加入権激安!ISDNライトなら9800円で電話が引ける!?(株)コムズ ↓詳しくはここをクリック! <http://www.comzz.co.jp/cgi-bin/cookie/set.cgi?t=top&id=2543> └─────────────────────────────┘ ─────────────────────────────── ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● コンボボックス ● 今回は、コンボボックス について触れていきます. 関数などの説明は、サンプルのあとに乗せていきます。 それでは、コードを示していきたいと思います。 ┌─────────────────────────────┐ #include<windows.h> #include "resource.h" #undef WindowsName #define WindowsName "Windows" /* デバッグ用メッセージボックス */ void Mes(char*error); void Mes(char*error) { MessageBox(NULL,error,"Error",MB_OK); } HWND hwndMain; HINSTANCE hInst; BOOL fActive; LRESULT CALLBACK DlgProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam); int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { WNDCLASSEX wc; hInst=hInstance; wc.hInstance =hInstance; wc.lpszClassName=WindowsName; wc.lpszMenuName=WindowsName; wc.lpfnWndProc =NULL; wc.cbSize =sizeof(WNDCLASSEX); wc.hbrBackground =(HBRUSH)GetStockObject(GRAY_BRUSH); wc.cbClsExtra =0; wc.cbWndExtra =0; wc.hIcon =(HICON)LoadIcon(NULL,IDI_APPLICATION); wc.hCursor=(HCURSOR)LoadCursor(NULL,IDC_ARROW); wc.style =CS_HREDRAW|CS_VREDRAW; wc.hIconSm =NULL; if(!(ATOM)RegisterClassEx(&wc)) { Mes("レジスタークラスに登録を失敗しました。または、WNDCLASSEXの初期化に失敗しました。") ; return 0; } hwndMain = CreateDialog( hInstance, "MAIN" , hwndMain, (DLGPROC)DlgProc ) ; if( hwndMain != NULL ) { ShowWindow( hwndMain, nCmdShow ) ; UpdateWindow( hwndMain ) ; } MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK DlgProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { int i; char data[256]; int count; switch (message) { case WM_CREATE: break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_BUTTON1: //追加 GetWindowText(GetDlgItem(hwnd,IDC_EDIT1),data,lstrlen(data)); SendMessage(GetDlgItem(hwnd,IDC_COMBO1),CB_ADDSTRING,(WPARAM)0, (LPARAM)data); //SendMessage(GetDlgItem(hwnd,IDC_COMBO1),CB_INSERTSTRING,(WPARAM)-1,(LPARAM)data); break; case IDC_BUTTON2: //削除 i=SendMessage(GetDlgItem(hwnd,IDC_COMBO1),CB_GETCURSEL,0L,0L); i=SendMessage(GetDlgItem(hwnd,IDC_COMBO1),CB_DELETESTRING,(WPARAM)i,(LPARAM)0L); if (i==CB_ERR) SetWindowText(GetDlgItem(hwnd,IDC_EDIT1),"削除失敗"); else SetWindowText(GetDlgItem(hwnd,IDC_EDIT1),"削除成功"); break; case IDC_BUTTON3: //DIR SendMessage(GetDlgItem(hwnd,IDC_COMBO1),CB_DIR, DDL_ARCHIVE|DDL_DIRECTORY|DDL_DRIVES|DDL_EXCLUSIVE|DDL_HIDDEN|DDL_READONLY |DDL_READWRITE|DDL_SYSTEM, (LPARAM)"*.*"); break; case IDC_BUTTON4: //FINDSTRING GetWindowText(GetDlgItem(hwnd,IDC_EDIT1),data,lstrlen(data)); i=SendMessage(GetDlgItem(hwnd,IDC_COMBO1),CB_FINDSTRING,(WPARAM)-1,(LPARAM)data); if (i==CB_ERR) SetWindowText(GetDlgItem(hwnd,IDC_EDIT1),"ERROR"); else { wsprintf(data,"インデックス値 %d",i); SetWindowText(GetDlgItem(hwnd,IDC_EDIT1),data); } break; case IDC_BUTTON5: //SELECTSTRING GetWindowText(GetDlgItem(hwnd,IDC_EDIT1),data,lstrlen(data)); SendMessage(GetDlgItem(hwnd,IDC_COMBO1),CB_SELECTSTRING,(WPARAM)-1,(LPARAM)data); break; case IDC_BUTTON6: //COUNT count=SendMessage(GetDlgItem(hwnd,IDC_COMBO1),CB_GETCOUNT,0L,0L); wsprintf(data,"%d個あります",count); SetWindowText(GetDlgItem(hwnd,IDC_EDIT1),(LPCTSTR)data); break; case IDOK: SetWindowText(hwnd,"バー表示をかえる。"); break; case IDCANCEL: PostQuitMessage(0); break; } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,message,wParam,lParam); } return 0; } └─────────────────────────────┘ ---------------------------------------------------------------- ■■■■■■■■■■■■■■■■ 毎日届く無料メールマガジン ■■■ ■ 『日刊フリーソフト ■ win版』 Windowsユーザーさんは必見。 ■ 便利でお得なフリーソフトを紹介します。 ■■■■ http://www.ne.jp/asahi/cineman/com/freesoft/ ■■■■ ---------------------------------------------------------------- ------------------------------------ ☆ MSX電遊ランド 8/20 東京秋葉原開催決定 http://imahi.com/dm.htm ☆ なつかしのMSXパソコン情報誌/メル友・告知情報誌/相互広告情報誌 ☆ 何が届くかわからない「やみなべ」発行中 http://imahi.com/msxmag.htm ----この広告は「相互広告ネットワーク」提供です --------------PR---- さて、説明を記していきます. ─────────────────────────────── hwndMain = CreateDialog( hInstance, "MAIN" , hwndMain, (DLGPROC)DlgProc ) ; if( hwndMain != NULL ) { ShowWindow( hwndMain, nCmdShow ) ; UpdateWindow( hwndMain ) ; } ────────────────────────────── 今回は,ダイアログを使います. 今回は,リソースファイルを使い作成します. 作成したダイアログ名には, ”MAIN ” と付けてください. また、ダイアログに命令を伝えるために、(DLGPROC)DlgProcを 追加しています. また、ウィンドウを写す処理などは以前までと同様のものです。 ─────────────────────────────── case WM_COMMAND: 部の説明 ─────────────────────────────── case IDC_BUTTON1: //追加 GetWindowText(GetDlgItem(hwnd,IDC_EDIT1),data,lstrlen(data)); SendMessage(GetDlgItem(hwnd,IDC_COMBO1),CB_ADDSTRING,(WPARAM)0, (LPARAM)data); //SendMessage(GetDlgItem(hwnd,IDC_COMBO1),CB_INSERTSTRING,(WPARAM)-1,(LPARAM)data); break; ───────────────────────────── ここでは、SendMessage関数を用いてコンボボックスへ EDITボックスにかかれている文字を追加しています. ─────────────────────────────── SendMessage(GetDlgItem(hwnd,IDC_COMBO1),CB_ADDSTRING,(WPARAM)0, (LPARAM)data); GetDlgItem(hwnd,IDC_COMBO1) = COMBOBOX の hWNDを取得しています. そして得たHWNDをSendMessageに割り当てています. CB_ADDSTRING WPARAM 0 に設定。 LPARAM 追加したい文字列 戻り値 追加した項目のINDEX値 //SendMessage(GetDlgItem(hwnd,IDC_COMBO1),CB_INSERTSTRING,(WPARAM)-1,(LPARAM)data); ここでは、コメントアウトされていますが、もうひとつ追加する方法があります. それは、CB_INSERTSTRING を使う方法です. ただし、CBS_SORTスタイルを持つリストの並び替えは行われません. ─────────────────────────────── case IDC_BUTTON2: //削除 i=SendMessage(GetDlgItem(hwnd,IDC_COMBO1),CB_GETCURSEL,0L,0L); i=SendMessage(GetDlgItem(hwnd,IDC_COMBO1),CB_DELETESTRING,(WPARAM)i,(LPARAM)0L); if (i==CB_ERR) SetWindowText(GetDlgItem(hwnd,IDC_EDIT1),"削除失敗"); else SetWindowText(GetDlgItem(hwnd,IDC_EDIT1),"削除成功"); break; ─────────────────────────────── ここでは、コンボボックスないの選択されている文字を削除しています. まず、CB_GETSURSEL を用いて選択されている文字のINDEXを取得。 次にそのINDEXにある文字を削除しています. また、削除に成功失敗は、メッセージをEditボックスに送っています. ─────────────────────────────── CB_GETCURSEL WPARAM 0 LPARAM 0 戻り値 INDEX値 失敗 CB_ERR CB_DELETESTRING WPARAM インデックス値 LPARAM 0 戻り値 残りの文字列の数 ───────────── ────────────────── case IDC_BUTTON3: //DIR SendMessage(GetDlgItem(hwnd,IDC_COMBO1),CB_DIR, DDL_ARCHIVE|DDL_DIRECTORY|DDL_DRIVES|DDL_EXCLUSIVE|DDL_HIDDEN|DDL_READONLY |DDL_READWRITE|DDL_SYSTEM, (LPARAM)"*.*"); break; ─────────────────────────────── ここでは、ディレクトリをコンボボックスに追加しています. CB_DIR WPARAM ファイルの属性 LPARAM 拡張子 戻り値 リストに最後に追加されたINDEX値 エラー CB_ERR ────────────────────────────── case IDC_BUTTON4: //FINDSTRING GetWindowText(GetDlgItem(hwnd,IDC_EDIT1),data,lstrlen(data)); i=SendMessage(GetDlgItem(hwnd,IDC_COMBO1),CB_FINDSTRING,(WPARAM)-1,(LPARAM)data); if (i==CB_ERR) SetWindowText(GetDlgItem(hwnd,IDC_EDIT1),"ERROR"); else { wsprintf(data,"インデックス値 %d",i); SetWindowText(GetDlgItem(hwnd,IDC_EDIT1),data); } break; case IDC_BUTTON5: //SELECTSTRING GetWindowText(GetDlgItem(hwnd,IDC_EDIT1),data,lstrlen(data)); endMessage(GetDlgItem(hwnd,IDC_COMBO1),CB_SELECTSTRING,(WPARAM)-1,(LPARAM)data); break; ─────────────────────────────── ここでは、両者ともに検索をおこなっています。 違いは,INDEX値をかえすのか。文字列 & INDEX値を返すのかです。 CB_FINDSTRING WPARAM 探し始めるINDEXの場所 −1は、はじめから. LPARAM 探す文字列 戻り値 INDEX値 エラー CB_ERR CB_SELECTSTRING WPARAM 探し始めるINDEXの場所 −1は、はじめから. LPARAM 探す文字列 戻り値 INDEX値 エラー CB_ERR このメッセージの場合は,見つかった場合コンボボックスにその文字列が表示されます. ─────────────────────────────── case IDC_BUTTON6: //COUNT count=SendMessage(GetDlgItem(hwnd,IDC_COMBO1),CB_GETCOUNT,0L,0L); wsprintf(data,"%d個あります",count); SetWindowText(GetDlgItem(hwnd,IDC_EDIT1),(LPCTSTR)data); break; ─────────────────────────────── ここでは、コンボボックスないにある文字列の数の 総計を取っています. CB_GETCOUNT WPARAM 0L LPARAM 0L 戻り値 総計 エラー CB_ERR ─────────────────────────────── case IDOK: SetWindowText(hwnd,"バー表示をかえる。"); break; ─────────────────────────────── おまけ:タイトルバーの文字を変えています. ─────────────────────────────── case IDCANCEL: PostQuitMessage(0); break; ─────────────────────────────── 最後にCANCELで終了です. ─────────────────────────────── 今回のAPIなどは,VBなどでも使えるものもあります. 慣れれば、それほど苦にはならないと思いますので, いろいろなコードを作ってみてはどうでしょう. └─────────────────────────────┘ なお、以上のプログラムは、私の動作環境VC++6.0 Win32 Application で確認済みです. ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 発行者あとがき: しかし、コンピュータ言語はどこまで増えていくのでしょうか? 標準というものがほしいですね. MSDN7月分が届きました.またか、という感じです. その容量1.5ギガ、時代ですね. と、最近行った店の紹介をします. 車好きな人にはいいかもしれませんね. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 茨城県の片田舎、竜ヶ崎にこんな店があったなんて! そう。そこがPix CAFE。 パスタが美味い!ピッツァが美味い!ついで、店長ウクレレ上手い! みんなでガヤガヤ、二人でしっとり、一人のさびしい人は責任を 持っておなぐさめ致します。 まあ、とりあえずいらっしゃいよ! Pix CAFE 住所:茨城県竜ヶ崎市中根台2−2−4 TEL:0279−65−4440 URL< http://www.geocities.co.jp/Foodpia/8873/> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ また、また この店が面白いです. ぜひ、カウンターに座りましょう. 小腹がすいているときは,ワッフルでもどうぞ。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ メールアドレス:<mailto:rain2000@geocities.co.jp> ホームページ :<http://www.geocities.co.jp/SiliconValley-Bay/3125> 発行者:rain2000 編集 :rain2000 このメールマガジンは,以下の発行者さんを通して発行してます. ●まぐまぐ: アドレス : http://www.mag2.com/ ID : 0000024922 ●クリックインカム: アドレス :http://clickincome.net/ ID : m00002885 ●Pubzine アドレス :Pubzine (http://www.pubzine.com/) ID :004293 ●ここでメール アドレス : http://mail.cocode.ne.jp/ ID : 0400100071 ●メルマガ天国 アドレス : http://melten.com/ ID : 300 ●E-magazine アドレス :http://www.emaga.com/ ID :cwindows ●Macky アドレス : http://macky.nifty.ne.jp/ ID : 2329 ●カプライト アドレス : http://kapu.cplaza.ne.jp/ ID : 234 また、登録解除などの手続きに関しましては,上記の ホームにてお願いします. ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ |