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;
}
}