16章 コントロール概説(その1)

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis"></meta>
<title>16章 コントロール概説(その1)</title>
</head>

<body bgcolor="WHITE">
<font size="5">16章 コントロール概説(その1)</font>
<hr>
<p>
 今回(16章)と次回(17章)で、Windowsが提供する基本的なコントロールを紹介します。つまり、ここ(16章と17章)では、使い方は説明しないという事です。
<p>
 基本的なコントロールは、そのウインドウクラス名から、6つに分類されます。つまり、<b><i><u>スタティックコントロール</u></i></b>、<b><i><u>ボタンコントロール</u></i></b>、<b><i><u>エディットコントロール</u></i></b>、<b><i><u>リストボックスコントロール</u></i></b>、<b><i><u>コンボボックスコントロール</u></i></b>、そして<b><i><u>スクロールバーコントロール</u></i></b>です。
<p>
 Windowsが提供するコントロールは、CreateWindow関数を用いて作ります。そして、その時、ウインドウスタイルを指定する場所で独自のスタイルを追加指定する事により、同じウインドウクラスを用いていても大きく概観と機能が変ります。
<p>
 今回は、比較的使用頻度の高いと思われる3つのコントロール。つまり、スタティックコントロール、ボタンコントロール、そして、エディットコントロールを先に紹介します。
<hr>
<p>
<b>・スタティックコントロール</b>
<p>
 主に文字列の表示をするコントロールです。ですが、矩形やビットマップも表示できます。サンプルを下に示します。
<p>
<p>
<table border="1" bgcolor="#F0F0F0">
<caption align="BOTTOM">リスト16-1<a href="c16s.lzh">ダウンロード</a>
<tr><td>
<pre>
/*
  『C言語で始めるWindowsプログラミング』
   16章のサンプルプログラム
                   Programmed by Y.Kondo

/


#define STRICT
#include &lt;windows.h&gt;
#include "wndproc.h"
#include "resource.h"

/*===============================================================================*/

/* このファイル内でのみ用いられる関数のプロトタイプ宣言 */
static LRESULT Wm_CreateProc(HWND,LPCREATESTRUCT);
static LRESULT Wm_DestroyProc(HWND);
static LRESULT Wm_CommandProc(HWND,WORD,WORD,HWND);

/* メインウインドウのウインドウプロシージャ */
LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
  switch(message)
   {
       case    WM_CREATE:
           return  Wm_CreateProc(hwnd,(LPCREATESTRUCT)lparam);
       case    WM_DESTROY:
           return  Wm_DestroyProc(hwnd);
       case    WM_COMMAND:
           return  Wm_CommandProc(hwnd,HIWORD(wparam),LOWORD(wparam),(HWND)lparam);
   }
   return  DefWindowProc(hwnd,message,wparam,lparam);
}

/*===============================================================================*/

static LRESULT Wm_CreateProc(HWND hwnd,LPCREATESTRUCT cs)
{
  HBITMAP     hBitmap;    /*  ビットマップのハンドル  */

  /*  もっとも一般的な使い方  */
   CreateWindow(<b>"STATIC"</b>,"最も一般的な使い方",
                WS_CHILD|WS_VISIBLE|<b>SS_LEFT</b>,
                0,0,300,30,
                hwnd,
                (HMENU)1,
                cs-&gt;hInstance,
                NULL);
   /*  右詰めもOK    */
   CreateWindow(<b>"STATIC"</b>,"右詰めもOK",
                WS_CHILD|WS_VISIBLE|<b>SS_RIGHT</b>,
                0,30,300,30,
                hwnd,
                (HMENU)2,
                cs-&gt;hInstance,
                NULL);
   /*  黒枠            */
   CreateWindow(<b>"STATIC"</b>,"",
                WS_CHILD|WS_VISIBLE|<b>SS_BLACKFRAME</b>,
                0,60,300,30,
                hwnd,
                (HMENU)3,
                cs-&gt;hInstance,
                NULL);
   /*  黒の矩形        */
   CreateWindow(<b>"STATIC"</b>,"",
                WS_CHILD|WS_VISIBLE|<b>SS_BLACKRECT</b>,
                0,90,300,30,
                hwnd,
                (HMENU)4,
                cs-&gt;hInstance,
                NULL);
   /*  ビットマップも表示できます  */
   CreateWindow(<b>"STATIC"</b>,"",
                WS_CHILD|WS_VISIBLE|<b>SS_BITMAP</b>,
                0,120,300,60,
                hwnd,
                (HMENU)5,
                cs-&gt;hInstance,
                NULL);
   hBitmap=<b>LoadBitmap(cs-&gt;hInstance,MAKEINTRESOURCE(IDB_BITMAP1))</b>;
   SendDlgItemMessage(hwnd,5,<b>STM_SETIMAGE</b>,IMAGE_BITMAP,(LPARAM)hBitmap);
   /*  白の矩形        */
   CreateWindow(<b>"STATIC"</b>,"",
                WS_CHILD|WS_VISIBLE|<b>SS_WHITERECT</b>,
                0,180,300,30,
                hwnd,
                (HMENU)6,
                cs-&gt;hInstance,
                NULL);
   /*  親にクリックを通知さすことも可能    */
   CreateWindow(<b>"STATIC"</b>,"ここをクリックしてください",
                WS_CHILD|WS_VISIBLE|WS_BORDER|<b>SS_NOTIFY</b>|<b>SS_CENTER</b>,
                0,210,300,30,
                hwnd,
                (HMENU)7,
                cs-&gt;hInstance,
                NULL);
   return  0;  
}

static LRESULT Wm_DestroyProc(HWND hwnd)
{
  PostQuitMessage(0);
   return  0;
}

static LRESULT Wm_CommandProc(HWND hwnd,WORD wNotifyCode,WORD wID,HWND hwndCtl)
{
  if(wID==7 &amp;&amp; wNotifyCode==<b>STN_CLICKED</b>)
       MessageBox(hwnd,"スタティックコントロールは\r\n"
                       "親にクリックされれたことを\r\n"
                       "通知することが出来ます。",
                       "説明",MB_ICONINFORMATION|MB_OK);
   return  0;
}
</pre>
</table>
<p>
 リスト16-1を見てお分かりのように、ウインドウスタイルに論理和で<b><i><u>SS_何々</u></i></b>を付け足すことでスタティックコントロールの概観と機能が変ります。
<p>
 スタティックコントロールにメッセージをSENDする事も可能です。今回は、ビットマップを表示さすために、リソースからビットマップをロードして、そのハンドルをSTM_SETIMAGEメッセージに付加してSENDしています。
<p>
 <b><i><u>SS_NOTIFY</u></i></b>を指定した場合、スタティックコントロールは親ウインドウに通知メッセージを送ります。通知メッセージは、<b><i><u>STN_何々</u></i></b>です。
<hr>
<p>
<b>・ボタンコントロール</b>
<p>
 プッシュボタンで知られるコントロールですね。しかし、チェックボックスやラジオボタンも同じクラスに属します。ただ、筆者も驚くのが、グループボックスとして知られる視覚的にコントロールを整理するだけの枠が、ボタンコントロールに含まれる事です。
<p>
 チェックボックスと言うのは、Yes/Noを選択したりするのに用いられます。また、ラジオボタンは複数の選択肢の中から1つを選ぶボタンコントロールですね。ソースコードを見るときは、WS_GROUPスタイルに注目してください。
<p>
<p>
<table border="1" bgcolor="#F0F0F0">
<caption align="BOTTOM">リスト16-2<a href="c16b.lzh">ダウンロード</a>
<tr><td>
<pre>
/*
  『C言語で始めるWindowsプログラミング』
   16章のサンプルプログラム
                   Programmed by Y.Kondo

/


#define STRICT
#include &lt;windows.h&gt;
#include "wndproc.h"
#include "resource.h"

/*===============================================================================*/

/* このファイル内でのみ用いられる関数のプロトタイプ宣言 */
static LRESULT Wm_CreateProc(HWND,LPCREATESTRUCT);
static LRESULT Wm_DestroyProc(HWND);
static LRESULT Wm_CommandProc(HWND,WORD,WORD,HWND);

/* メインウインドウのウインドウプロシージャ */
LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
  switch(message)
   {
       case    WM_CREATE:
           return  Wm_CreateProc(hwnd,(LPCREATESTRUCT)lparam);
       case    WM_DESTROY:
           return  Wm_DestroyProc(hwnd);
       case    WM_COMMAND:
           return  Wm_CommandProc(hwnd,HIWORD(wparam),LOWORD(wparam),(HWND)lparam);
   }
   return  DefWindowProc(hwnd,message,wparam,lparam);
}

/*===============================================================================*/

static LRESULT Wm_CreateProc(HWND hwnd,LPCREATESTRUCT cs)
{
  HBITMAP     hBitmap;    /*  ビットマップのハンドル  */

  /*  もっとも一般的な使い方  */
   CreateWindow(<b>"BUTTON"</b>,"最も一般的な使い方",
                WS_CHILD|WS_VISIBLE|<b>BS_PUSHBUTTON</b>,
                0,0,300,30,
                hwnd,
                (HMENU)1,
                cs-&gt;hInstance,
                NULL);
   /*  ビットマップボタンも簡単に出来ますよ    */
   CreateWindow(<b>"BUTTON"</b>,"",
                WS_CHILD|WS_VISIBLE|<b>BS_BITMAP</b>,
                0,30,300,30,
                hwnd,
                (HMENU)2,
                cs-&gt;hInstance,
                NULL);
   hBitmap=LoadBitmap(cs-&gt;hInstance,MAKEINTRESOURCE(IDB_BITMAP1));
   SendDlgItemMessage(hwnd,2,<b>BM_SETIMAGE</b>,IMAGE_BITMAP,(LPARAM)hBitmap);
   /*  俗に言うチェックボックス                */
   CreateWindow(<b>"BUTTON"</b>,"チェックボックスですね",
                WS_CHILD|WS_VISIBLE|<b>BS_AUTOCHECKBOX</b>,
                0,60,300,30,
                hwnd,
                (HMENU)3,
                cs-&gt;hInstance,
                NULL);
   /*  ラジオボタンですね。多くの中から1つを選択するのに用います  */
   CreateWindow(<b>"BUTTON"</b>,"選択肢:その1",
                WS_CHILD|WS_VISIBLE|<b>WS_GROUP</b>|<b>BS_AUTORADIOBUTTON</b>,
                0,90,300,30,
                hwnd,
                (HMENU)4,
                cs-&gt;hInstance,
                NULL);
   CreateWindow(<b>"BUTTON"</b>,"選択肢:その2",
                WS_CHILD|WS_VISIBLE|<b>BS_AUTORADIOBUTTON</b>,
                0,120,300,30,
                hwnd,
                (HMENU)5,
                cs-&gt;hInstance,
                NULL);
   CreateWindow(<b>"BUTTON"</b>,"選択肢:その3",
                WS_CHILD|WS_VISIBLE|<b>BS_AUTORADIOBUTTON</b>,
                0,150,300,30,
                hwnd,
                (HMENU)6,
                cs-&gt;hInstance,
                NULL);
   /*  初期値として選択肢1にチェックを入れます    */
   SendDlgItemMessage(hwnd,4,BM_SETCHECK,BST_CHECKED,0);
   CreateWindow(<b>"BUTTON"</b>,"これでもボタンコントロールなんです",
                WS_CHILD|WS_VISIBLE|<b>WS_GROUP</b>|<b>BS_GROUPBOX</b>,
                0,180,300,60,
                hwnd,
                (HMENU)7,
                cs-&gt;hInstance,
                NULL);
    return  0;  
}

static LRESULT Wm_DestroyProc(HWND hwnd)
{
  PostQuitMessage(0);
   return  0;
}

static LRESULT Wm_CommandProc(HWND hwnd,WORD wNotifyCode,WORD wID,HWND hwndCtl)
{
  if(wNotifyCode==<b>BN_CLICKED</b>)
       switch(wID)
       {
           case    1:  MessageBox(hwnd,"最も一般的な使い方","ボタンが押されました",MB_OK);
                       break;
           case    2:  MessageBox(hwnd,"ビットマップボタン","ボタンが押されました",MB_OK);
                       break;
       }

  return  0;
}
</pre>
</table>
<p>
 リスト16-2を見てお分かりのように、ウインドウスタイルに論理和で<b><i><u>BS_何々</u></i></b>を付け足すことでボタンコントロールの概観と機能が変ります。
<p>
 ボタンコントロールにメッセージをSENDする事も可能です。今回は、ビットマップを表示さすために、リソースからビットマップをロードして、そのハンドルをBM_SETIMAGEメッセージに付加してSENDしています。
<p>
 BN_CLICK通知メッセージは、BS_NOTIFYスタイルの有無に関わらず親ウインドウに送られてきます。もし、BS_NOTIFYスタイルを指定すると、ボタンコントロールは詳細な情報を親に通知してきます。
<p>
 WS_GROUPスタイルですが、ラジオボタンの選択範囲を決める物と思ってください。コントロールの作成順に、WS_GROUPスタイルが付いたコントロールがグループの先頭になるのです。これについては、いずれ詳しく説明します。
<hr>
<p>
<b>・エディットコントロール</b>
<p>
 テキストを入力する為のコントロールです。シングルライン入力、シングルライン入力かつ自動スクロール、複数行の入力など、色々なバリエーションから選べます。
<p>
<p>
<table border="1" bgcolor="#F0F0F0">
<caption align="BOTTOM">リスト16-3<a href="c16e.lzh">ダウンロード</a>
<tr><td>
<pre>
/*
  『C言語で始めるWindowsプログラミング』
   16章のサンプルプログラム
                   Programmed by Y.Kondo

/


#define STRICT
#include &lt;windows.h&gt;
#include "wndproc.h"

/*===============================================================================*/

/* このファイル内でのみ用いられる関数のプロトタイプ宣言 */
static LRESULT Wm_CreateProc(HWND,LPCREATESTRUCT);
static LRESULT Wm_DestroyProc(HWND);

/* メインウインドウのウインドウプロシージャ */
LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
  switch(message)
   {
       case    WM_CREATE:
           return  Wm_CreateProc(hwnd,(LPCREATESTRUCT)lparam);
       case    WM_DESTROY:
           return  Wm_DestroyProc(hwnd);
   }
   return  DefWindowProc(hwnd,message,wparam,lparam);
}

/*===============================================================================*/

static LRESULT Wm_CreateProc(HWND hwnd,LPCREATESTRUCT cs)
{
  /*  最も基本的なエディットコントロール  */
   CreateWindow(<b>"EDIT"</b>,"",
                WS_CHILD|WS_VISIBLE,
                10,10,300,20,
                hwnd,
                (HMENU)1,
                cs-&gt;hInstance,
                NULL);
   /*  横方向の自動スクロール対応          */
   CreateWindow(<b>"EDIT"</b>,"",
                WS_CHILD|WS_VISIBLE|<b>ES_AUTOHSCROLL</b>,
                10,40,300,20,
                hwnd,
                (HMENU)2,
                cs-&gt;hInstance,
                NULL);
   /*  複数行対応でスクロールバー対応      */
   CreateWindow(<b>"EDIT"</b>,"",
                WS_CHILD|WS_VISIBLE|<b>WS_HSCROLL</b>|<b>WS_VSCROLL</b>|<b>ES_MULTILINE</b>,
                10,70,300,100,
                hwnd,
                (HMENU)3,
                cs-&gt;hInstance,
                NULL);
   /*  パスワード入力用                */
   CreateWindow(<b>"EDIT"</b>,"",
                WS_CHILD|WS_VISIBLE|<b>ES_PASSWORD</b>,
                10,180,300,20,
                hwnd,
                (HMENU)4,
                cs-&gt;hInstance,
                NULL);
   return  0;
}

static LRESULT Wm_DestroyProc(HWND hwnd)
{
  PostQuitMessage(0);
   return  0;
}
</pre>
</table>
<p>
 リスト16-3を見てお分かりのように、ウインドウスタイルに論理和で<b><i><u>ES_何々</u></i></b>を付け足すことでエディットコントロールの概観と機能が変ります。
<p>
 また、WS_HSCROLLやWS_VSCROLLを付け加えることで、スクロールバーをウインドウに付けることが出来ます。これは、次回説明するスクロールバーコントロールとは別物です。
<hr>
<p>
 今回は、コントロールの紹介だけでつまらなかったと思います。次回も、残り3つのコントロールの紹介です。物事には手順があるので我慢してください。20章あたりから面白くなるようにします。
<p align="RIGHT">
1999年11月20日<br>
修正1999年11月21日
<hr>
<p align="RIGHT">
<a href="/web/20160512221854/http://web.kyoto-inet.or.jp:80/people/ysskondo/index.html">目次</a><br>
<a href="chap17.html">次へ</a>
<hr>
<p align="RIGHT">
著作権者:近藤妥

</body>
</html>

  • 最終更新:2018-03-11 04:49:39

このWIKIを編集するにはパスワード入力が必要です

認証パスワード