![]()
![]()
| 1,Menu | チェックをつける 選択不可能にする |
| 2,ToolBox | |
| 3,StatusBar | One Point Help 表示する |
以前にもmenuの紹介はしましたが、ここではもっと細かいことまで説明します。
まず、以下のようなアプリをつくってください。

このようにツールボックス、ステータスバーを持つアプリをつくります。
では、mouseをクリックしたところで円を書くプログラムを書きます。
以下のようなメッセージハンドラをつくります。
| クラス | メッセージ | メンバ関数 |
| CNamaeView | 左ボタンが押された | OnLButtonDown |
そこに次のようなコードを書きます。
void CNamaeView::OnLButtonDown(UINT nFlags, CPoint point)
{
CDC* pDC=GetDC();
CBrush newBrush;
CBrush* oldBrush;
newBrush.CreateSolidBrush(RGB(0,0,255));
oldBrush=pDC->SelectObject(&newBrush);
pDC->Ellipse(point.x-5,point.y-5,point.x+5,point.y+5);
pDC->SelectObject(oldBrush);
newBrush.DeleteObject();
ReleaseDC(pDC);
CView::OnLButtonDown(nFlags, point);
}
一見複雑そうですがブラシの定義のためです。
ここでは、点を打った場所がpoint変数にCPoint型で格納されています。
円は、この点を中心に半径5ドットでかかれます。
実行すると以下のようになります。

ここでは、円の色を変えることを考えます。
CNamaeViewクラス全体のスコープを持つ変数を次のように定義します。
まず、CNamaeView.hの宣言部で
class CNamaeView : public CView
{
private:
COLORREF iro;
・・・
このようにクラス全体で使える変数を宣言します。
また、コントラスタで
CNamaeView::CNamaeView()
{
iro=RGB(0,0,255);
}
メッセージハンドラで
void CNamaeView::OnLButtonDown(UINT nFlags, CPoint point)
{
CDC* pDC=GetDC();
CBrush newBrush;
CBrush* oldBrush;
newBrush.CreateSolidBrush(iro);
oldBrush=pDC->SelectObject(&newBrush);
pDC->Ellipse(point.x-5,point.y-5,point.x+5,point.y+5);
pDC->SelectObject(oldBrush);
newBrush.DeleteObject();
ReleaseDC(pDC);
CView::OnLButtonDown(nFlags, point);
}
これを実行すると

これは、先ほどと全く同じ動作をします。
さて、ここからやっと本題です。
以下のように色メニューをつくります。赤色はIDC_red、青色はIDC_aoにします。
それぞれのcommandメッセージに対応する関数を以下のようにつくります。
void CNamaeView::Onaka()
{
iro=RGB(255,0,0);
}
void CNamaeView::Onao()
{
iro=RGB(0,0,255);
}
これを実行すると、初期の色は青色、menuから色を選択すると対応した色になります。
しかし、これだけでは、現在何色が選択されているかわかりません。
そこで、UPDATE_COMMAND_UIに対するメッセージハンドラをつくります。
これは、メニューが開かれた際に呼び出されるものです。
そのときに、checkマークをつけるようにします。
void CNamaeView::OnUpdateaka(CCmdUI* pCmdUI)
{
if (iro==RGB(255,0,0)){
pCmdUI->SetCheck(TRUE);
}else{
pCmdUI->SetCheck(FALSE);
}
}
void CNamaeView::OnUpdateao(CCmdUI* pCmdUI)
{
if (iro==RGB(0,0,255)){
pCmdUI->SetCheck(TRUE);
}else{
pCmdUI->SetCheck(FALSE);
}
}
こうするとcheckマークがつきます。
選択が不可能になるとその項目が灰色になって選択できないようになります。
今までのプログラムを改造して、青が選択されている状態では再び青が
選択できないようにします。(赤についても)
void CNamaeView::OnUpdateaka(CCmdUI* pCmdUI)
{
if (iro==RGB(255,0,0)){
pCmdUI->SetCheck(TRUE);
pCmdUI->Enable(FALSE);
}else{
pCmdUI->SetCheck(FALSE);
pCmdUI->Enable(TRUE);
}
}
void CNamaeView::OnUpdateao(CCmdUI* pCmdUI)
{
if (iro==RGB(0,0,255)){
pCmdUI->SetCheck(TRUE);
pCmdUI->Enable(FALSE);
}else{
pCmdUI->SetCheck(FALSE);
pCmdUI->Enable(TRUE);
}
}
これを実行すると以下のようになります。

ここでは、現在の色が青になっているため、青にcheckマークがついていて
しかも選択不可能になっています。
ToolBoxは、menuの下のあたりにあるボタンのことです。
これはmenuの一種であると考えられます。ただ、menuと比べて
アイコンになっているので機能が一目でわかるし、一発で操作できます。
ToolBoxをつけるには、AppWizardで「ツールバー」の項目をチェックするだけです。
編集をするときは、リソースエディターで「ToolBox」の項目を選びます。
赤い色に対応するボタンのIDはIDC_akaにします。これは、menuのIDと同じです。
青についてもIDC_aoにします。
ToolBoxはmenuと連動していてmenuで選択不可能にすると
ToolBoxも灰色になり選択できません。
menuにcheckがつくとボタンはへこんだままになります。
これを実行すると以下のようになります。
ToolBoxにマウスカーソルを近づけると機能を表示されます。
そのとき、下のStatusBarにも少し詳しい機能が紹介されます。
これは簡単にできます。
ToolBoxのIDを決めるときにダイアログボックスを開いたと思うのですが
下の方に「プロンプト」というのがあったと思います。
ここに次のように記入します。
赤色にする\n赤色
青色にする\n青
\nをはさんで前半の部分は下のStatusBarに表示される文字
後半はToolBoxにmouseを近づけたときに表示される文字です。
実行結果は以下の通りです

ステータスバーに文字を表示することを考えてみます。
まず、ステータスバーを2分割してみましょう。
MainFrm.cppのなかで最初の方のコードを次のように変えます。
static UINT indicators[] =
{
ID_SEPARATOR,
ID_SEPARATOR,
ID_INDICATOR_KANA,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
ID_SEPARATORをもう1個増やしました。実行結果は以下の通りです。

さて、ここで選択されている色を第1ペインに表示するプログラムをつくります。
void CNamaeView::Onaka()
{
iro=RGB(255,0,0);
CStatusBar* a=(CStatusBar*)AfxGetApp()->
m_pMainWnd->GetDescendantWindow(AFX_IDW_STATUS_BAR);
a->SetPaneText(1,"赤");
}
void CNamaeView::Onao()
{
iro=RGB(0,0,255);
CStatusBar* a=(CStatusBar*)AfxGetApp()->
m_pMainWnd->GetDescendantWindow(AFX_IDW_STATUS_BAR);
a->SetPaneText(1,"青");
}
SetPaneText関数で、ステータスバーに文字を表示します。
1番目の引数はどこのペインに表示するかを指定します。
元々のペインは0番目で、今回新たにつくったペインは1番目になります。
これを実行すると

また、このSoftも添付します。
C++のPageに戻る