MFCコントロールボタンの実装技法

MFCウィンドウの作成/メッセージマッピング機構

mfc.h

#include<afxwin.h>//MFCヘッダファイル

//アプリケーションクラス
class MyAppApp:public CWinApp //アプリケーションクラスを継承
{
public:
	//プログラムエントリーポイント
	virtual BOOL InitializeInstance();
};

//フレームクラス
class MainFrame:public CFrameWnd
{
public:
	MainFrame();

	//マクロ宣言 メッセージマッピングメカニズムを提供
	DECLARE_MESSAGE_MAP()

	afx_msg void OnLeftButtonDown( UINT, CPoint );

	afx_msg void OnKeyInput( UINT, UINT,UINT ) ;

	afx_msg void OnRender( );
};

mfc.cpp

#include "mfc.h"

MainApp app;//グローバルアプリケーションオブジェクト 1つのみ

BOOL MainApp::InitializeInstance()
{
	//ウィンドウ作成
	MainFrame * frame = new MainFrame;

	//表示と更新
	frame -> ShowWindow(SW_SHOWNORMAL);
	frame -> UpdateWindow();

	m_pMainWnd = frame;//アプリケーションのメインウィンドウへのポインタを保存

	return TRUE;//正常に初期化完了
}

//境界マクロ
BEGIN_MESSAGE_MAP(MainFrame,CFrameWnd)
	ON_WM_LBUTTONDOWN()//マウス左ボタン押下

	ON_WM_CHAR()//キー押下

	ON_WM_PAINT()//描画

END_MESSAGE_MAP()

MainFrame::MainFrame()
{
	Create(NULL,TEXT("mfcアプリケーション"));//ウィンドウタイトル
}

//マウス処理
void MainFrame::OnLeftButtonDown( UINT, CPoint point)
{
	/*TCHAR buffer[1024];
	wsprintf(buffer,TEXT("x=%d,y=%d"),point.x,point.y);

	MessageBox(buffer);*/

	//MFCの文字列クラス CString
	CString message;
	message.Format(TEXT("座標: x=%d, y=%d"),point.x,point.y);
	MessageBox(message);
}

//キーボード処理
void MainFrame::OnKeyInput(UINT key, UINT,UINT)
{
	CString message;
	message.Format(TEXT("キー'%c'が押されました"),key);
	MessageBox(message);
}

//描画処理
void MainFrame::OnRender()
{
	CPaintDC dc(this);//CDCから取得
	dc.TextOutW(100,100,TEXT("描画サンプル"));//文字描画

	dc.Ellipse(10,10,100,100);//楕円描画

	//文字列長の取得
	int length=0;
	char *pointer ="サンプル文字列";
length=strlen(pointer);

	//ワイド文字列の長さ取得
	wchar_t *pointer2=L"ワイド文字";
length = wcslen(pointer2);

	//char * と CStringの変換
	//char * -> CString
	char *pointer3 = "変換サンプル";
CString message = CString(pointer3);
//CString->char *
CStringA temporary;
temporary = message;
char *pointerPointer = temporary.GetBuffer(); 
}

モーダルダイアログ/非モーダルダイアログ

カスタムダイアログ

エディットボックス

コピー ボタンの取得/設定

//コピー機能
void CEditControlDialog::OnBnClickedCopyButton()
{
	// TODO: ここにコントロール通知処理コードを追加
	//edit1の内容を取得し、edit2に設定

	CString content;
	m_edit1.GetWindowTextW(content);
	m_edit2.SetWindowTextW(content);
}

終了ボタン

//終了処理
void CEditControlDialog::OnBnClickedExitButton()
{
	// TODO: ここにコントロール通知処理コードを追加

	//exit(0);//アプリケーション終了

	//現在のダイアログを閉じる
	//CDialog::OnOK();
	CDialog::OnCancel();
}

コンテンツの設定/取得(値)

コントロール内容を変数に同期させる UpdateData(true)

void CEditControl2Dialog::OnBnClickedSetButton()
{
	// TODO: ここにコントロール通知処理コードを追加
	//変数を使用してeditの内容を設定・変更

	//内容設定
	m_text = TEXT("こんにちは");

	//変数内容をコントロールに同期
	UpdateData(FALSE);
}


void CEditControl2Dialog::OnBnClickedGetButton()
{
	// TODO: ここにコントロール通知処理コードを追加

	//コントロール内容を変数に同期
	UpdateData(TRUE);

	MessageBox(m_text);
}

コンボボックス

//コンボボックスへの追加操作
	m_combo.AddString(TEXT("項目1"));
	m_combo.AddString(TEXT("項目2"));
	m_combo.AddString(TEXT("項目3"));

	//デフォルト選択を最初の項目に設定
	m_combo.SetCurSel(0);

	//挿入
	m_combo.InsertString(3,TEXT("新規項目"));

	//削除
	m_combo.DeleteString(2);//0から始まるインデックス

	//インデックス1の内容を取得
	CString selectedItem;
	m_combo.GetLBText(1,selectedItem);
	MessageBox(selectedItem);


void CComboControlDialog::OnCbnSelchangeCombo1()
{
	// TODO: ここにコントロール通知処理コードを追加

	//選択されたインデックスを取得、変更があるたびにトリガー
	int selectedIndex = m_combo.GetCurSel();
	CString selectedItem;
	m_combo.GetLBText(selectedItem,selectedIndex);
	MessageBox(selectedItem);
}

コンボボックス

m_comboBox.SetCurSel(2); //デフォルト表示項目を設定

	CString item;
	m_comboBox.GetLBText(0,item);//0行目の内容を取得
	MessageBox(item);

	m_comboBox.AddString(TEXT("追加項目"));//追加
	//m_comboBox.InsertString();
	//m_comboBox.DeleteString();
	//m_comboBox.GetCurSel();

リストビューコントロール

//リストビューコントロールの使用
    //列見出しの挿入
	CString headers[] = {TEXT("名前"),TEXT("カテゴリ"),TEXT("価格")};
    
    //列の挿入
	for(int i=0;i<3;i++){
		//見出し設定   パラメータ1 インデックス 2内容 3配置方式 4幅
		m_list.InsertColumn(i,headers[i],LVCFMT_LEFT,100);
	}

	//本体データの設定、まず行を決定し、次に列を決定
	/*
	//見出しは本体データに含まれない、インデックスは0から開始
	m_list.InsertItem(0,TEXT("製品A"));
	//このアイテムに他の列のデータを挿入
	m_list.SetItemText(0,1,TEXT("電子機器"));
	m_list.SetItemText(0,2,TEXT("¥10000"));
	*/

	for(int i=0;i<10;i++){
		CString productName;
		productName.Format(TEXT("製品_%d"),i+1);
		m_list.InsertItem(i,productName);
		m_list.SetItemText(i,1,TEXT("カテゴリA"));
		m_list.SetItemText(i,2,TEXT("¥5000"));
	}

	//プロパティ設定 行全体選択状態LVS_EX_FULLROWSELECT グリッド表示LVS_EX_GRIDLINES
	m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

リストボックス——追加

//追加機能
void CListBoxDialog::OnBnClickedAddButton()
{
	// TODO: ここにコントロール通知処理コードを追加

	//エディット領域の内容を取得
	UpdateData(TRUE); //m_inputText

	if(m_inputText.GetLength()==0){
		MessageBox(TEXT("内容が空です"));
		return;
	}

	//リストボックスに内容を追加
	m_listBox.AddString(m_inputText);

	m_inputText.Empty();

	//エディット領域に内容を更新
	UpdateData(FALSE);
}

リストボックス——削除

//削除機能
void CListBoxDialog::OnBnClickedDeleteButton()
{
	// TODO: ここにコントロール通知処理コードを追加

	//現在選択されている行を取得
	int selectedItemIndex=m_listBox.GetCurSel();

	//削除
	m_listBox.DeleteString(selectedItemIndex);
}

リストボックス——変更

//変更機能
//選択された内容をエディットボックスに配置、確認ボタンで変更
//選択された内容をクリックすると自動でトリガー
void CListBoxDialog::OnLbnSelchangeList1()
{
	// TODO: ここにコントロール通知処理コードを追加
	//選択内容の取得->エディット領域に更新

	//選択内容の取得
	int selectedItemIndex=m_listBox.GetCurSel();

	//指定位置の内容を取得
	m_listBox.GetText(selectedItemIndex,m_inputText);

	//エディット領域に更新
	UpdateData(FALSE);
}


void CListBoxDialog::OnBnClickedModifyButton()
{
	// TODO: ここにコントロール通知処理コードを追加
	//まず削除
	//選択行のインデックスを取得
	int selectedItemIndex=m_listBox.GetCurSel();

	//削除
	m_listBox.DeleteString(selectedItemIndex);

	//元の位置に追加
	//エディット領域の内容を取得
	UpdateData(TRUE); //エディット領域をm_inputTextに更新

	//内容が空でないことを確認
	if(m_inputText.GetLength()==0){
		MessageBox(TEXT("内容が空です"));
		return;
	}

	//リストボックスに内容を追加
	m_listBox.InsertString(selectedItemIndex,m_inputText);

	m_inputText = TEXT("");

	//エディット領域に内容を更新
	UpdateData(FALSE);
}

ラジオボタン

void CRadioDialog::OnBnClickedButton1()
{
	// TODO: ここにコントロール通知処理コードを追加
	CString selection;

	if(IsDlgButtonChecked(IDC_RADIO1)){
		selection = TEXT("男性");
	}

	if(IsDlgButtonChecked(IDC_RADIO2)){
		selection = TEXT("女性");
	}
	MessageBox(selection);
}

//CWnd CheckRadioButton(IDC_RADIO1,IDC_RADIO2,IDC_RADIO1);//最初のID、最後のID、デフォルト選択

//内容変更 m_check.SetWindowTextW(TEXT("変更テキスト"));

//選択状態を設定 m_check.SetCheck(1);//0未選択、1選択

チェックボックス

void CCheckDialog::OnBnClickedButton2()
{
	// TODO: ここにコントロール通知処理コードを追加
	CString selections;

	if(IsDlgButtonChecked(IDC_CHECK1)){
		selections += TEXT("テスト\r\n");
	}

	if(IsDlgButtonChecked(IDC_CHECK2)){
		selections += TEXT("運用管理\r\n");
	}

	if(IsDlgButtonChecked(IDC_CHECK3)){
		selections += TEXT("フロントエンド\r\n");
	}

	if(IsDlgButtonChecked(IDC_CHECK4)){
		selections += TEXT("バックエンド\r\n");         //\r\n改行
	}
	MessageBox(selections);
}

Windows コントロール通知メッセージ(通知コード)、通常はコントロールのイベントや状態変化を処理するために使用されます。

1. BN_CLICKED`** 翻訳**:ボタンクリック通知 説明**:ユーザーがボタンをクリックしたときに送られる通知。

2. BN_DOUBLECLICKED`** 翻訳**:ボタンダブルクリック通知 説明**:ユーザーがボタンをダブルクリックしたときに送られる通知。

スライダーコントロール

スクロールバーの位置関係

switch (nSBCode) //スクロールバーのどの部分を判断 { case SB_THUMBPOSITION: //スライダーの位置 break; case SB_LINELEFT: //左矢印 break; case SB_LINERIGHT: //右矢印 break; case SB_PAGELEFT: //矢印とスライダーの間左 break; case SB_PAGERIGHT: //矢印とスライダーの間右 break; default: break; }

イベント処理関数

int currentPosition;
	if(pScrollBar == &m_slider){
		switch (nSBCode) //スクロールバーのどの部分を判断
		{
		case SB_THUMBPOSITION: //スライダーの位置
		{
			m_slider.SetScrollPos(nPos);
			m_position = nPos;
			UpdateData(FALSE);
			break;
		}
		case SB_LINELEFT: //左矢印
		{
			//スライダー位置の取得
			currentPosition = m_slider.GetScrollPos()-5;
			if(currentPosition<0){
				currentPosition = 0;
			}
			m_slider.SetScrollPos(currentPosition);
			m_position = currentPosition;
			UpdateData(FALSE);
			break;
		}
		case SB_LINERIGHT: //右矢印
		{
			//スライダー位置の取得
			currentPosition = m_slider.GetScrollPos()+5;
			if(currentPosition>100){
				currentPosition = 100;
			}
			m_slider.SetScrollPos(currentPosition);
			m_position = currentPosition;
			UpdateData(FALSE);
			break;
		}
		case SB_PAGELEFT: //矢印とスライダーの間左
		{
			//スライダー位置の取得
			currentPosition = m_slider.GetScrollPos()-5;
			if(currentPosition<0){
				currentPosition = 0;
			}
			m_slider.SetScrollPos(currentPosition);
			m_position = currentPosition;
			UpdateData(FALSE);
			break;
		}
		case SB_PAGERIGHT: //矢印とスライダーの間右
		{
			//スライダー位置の取得
			currentPosition = m_slider.GetScrollPos()+5;
			if(currentPosition>100){
				currentPosition = 100;
			}
			m_slider.SetScrollPos(currentPosition);
			m_position = currentPosition;
			UpdateData(FALSE);
			break;
		}
		default:
			break;
		}
	}

スピンボタン

WinAPIウィンドウプログラミング

MFCの処理フロー

タグ: MFC Windowsプログラミング GUI開発 VisualC++ コントロール

6月9日 21:53 投稿