メルマガ:■CからウィンドウズDIRECTXプログラミング
タイトル:■CからはじめるWindowsDirectXへの道 Vol33■  2000/08/05


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//    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
 また、登録解除などの手続きに関しましては,上記の  
  ホームにてお願いします.

┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


ブラウザの閉じるボタンで閉じてください。