MFCプログラミング02 コントロールまとめ02

̃Gg[͂ĂȃubN}[Nɒlj

MFCプログラミングシリーズ
前回から主要なコントロールの使い方についてまとめています。
今回も5つほど掲載します。
・リストボックス
・コンボボックス
・スクロールバー
・ピクチャボックス
・スピンボタン

リストボックス

コントロールを指すポインタの取得

CListBox* myLIST = (CListBox*)GetDlgItem(IDC_LIST1);

取得系の操作

myLIST->GetCount();		/*	項目数の取得	*/
myLIST->GetCurSel();	/*	選択中の項目番号を取得(CurSel:CurrentSel)	*/
myLIST->GetText(n, ss);	/*	n番目のテキストをssに格納(char ss[80];でもCString ss;でも可)	*/
myLIST->GetTextLen(3);	/*	3番目の項目の文字列長(byte)を取得	*/

エラー処理

int i=0;
i = myLIST->GetCurSel();
if(i != LB_ERR){	/*	エラーでなければ	*/
	/*	処理	*/
}

追加系の操作

myLIST->AddString("この文字列を新しい項目として追加");
myLIST->InsertString( 5, "5番目の項目に追加");
myLIST->InsertString(-1, "最後尾の項目に追加");
myLIST->DeleteString(3);/*	3番目の項目を削除	*/
myLIST->ResetContent();	/*	全項目を削除		*/

ディレクトリ操作

/*	注)*は正規表現ではなくワイルドカード	*/
myLIST->Dir(0, "c:\windows\*.*");	/*	windowsフォルダ直下の全ファイル名を表示		*/
myLIST->Dir(0, "c:\windows\*.txt");/*	windowsフォルダ直下の全txtファイル名を表示	*/
myLIST->Dir(0, "c:/windows/*.txt");	/*	区切り記号は/でもよい(UNIX流)				*/
/*	Dirの第一引数は以下を組み合わせる	*/
/*	0x0000 : 読み書き可能ファイル(通常のファイル)	*/
/*	0x0001 : 読みだし専用ファイル					*/
/*	0x0002 : 隠しファイル							*/
/*	0x0004 : システムファイル						*/
/*	0x0010 : フォルダ								*/
/*	0x0020 : アーカイブファイル						*/
/*	0x4000 : 第二引数で指定した名前と一致する全てのドライブ	*/
/*	0x8000 : 排他指定をする							*/
myLIST->Dir(0x0011, "c:\windows\*.*");	/*	フォルダ・読みだし専用・通常ファイル名を表示	*/
myLIST->Dir(0x8011, "c:\windows\*.*");	/*	フォルダ・読みだし専用ファイル名を表示	*/
/*	既定のイベントは、リストボックスで項目をクリックした時の	*/
void Cvdlist1Dlg::OnLbnSelchangeList1()
{
	・・・
}

ソートについては注意が必要。
・SortプロパティはdefaultでTrueになっているので注意。
・SortプロパティがTrueならば、AddStringによる項目追加後にソートされる。
・InsertStringによる項目追加はソートの対象にならない。

全項目に対して何らかの操作をしたい時

int i=0, ct=0;
ct = myLIST->GetCount();
for(i=ct-1;i>=0;i--){
	if(何かの条件ならば){
		myLIST->DeleteString(i);	/*	何らかの操作(項目削除等)	*/
	}
}

コンボボックス

コントロールを指すポインタの取得

CComboBox* myCombo = (CComboBox*)GetDlgItem(IDC_COMBO1);

取得系の操作

myCombo->GetCount();	/*	登録数を取得	*/
myCombo->GetCurSel();	/*	選択されている項目番号を取得	*/
myCombo->GetLBText(n, ss);	/*	n番目のテキストをssに取得(char ss[80];でもCString ss;でも可)	*/
myCombo->GetLBTextLen(3);	/*	3番目の項目の文字列長(byte)を取得	*/
myCombo->GetWindowText(ss);	/*	テキスト窓の文字列をssに取得		*/
myCombo->Dir(0, "c:\windows\*.*");	/*	ファイル名一覧を取得	*/

設定系の操作

myCombo->DeleteString(3);	/*	3番目の項目を削除する	*/
myCombo->ResetContent();	/*	全項目を削除する	*/
myCombo->AddString("この項目を追加");
myCombo->InsertString( 5, "この項目を5番目に追加");
myCombo->InsertString(-1, "この項目を最後に追加");
myCombo->SetWindowText(ss);	/*	テキスト窓に文字列ssを表示	*/

表示形式は3つ。
Typeプロパティ:ドロップダウン   =編集可 、矢印ボタン有※default
Typeプロパティ:ドロップダウンリスト=編集付加、矢印ボタン無
Typeプロパティ:標準        =編集可 、矢印ボタン無、リストを常に表示

スクロールバー

コントロールを指すポインタの取得

CScrollBar* mySBAR = (CScrollBar*)GetDlgItem(IDC_SCROLLBAR1);

取得系の操作

int nowpos=0, minpos=0, maxpos=0;
mySBAR->GetScrollRange(&minpos, &maxpos);/*	最小、最大位置を取得	*/
maxpos = mySBAR->GetScrollLimit();	/*	最大位置を取得	*/
nowpos = mySBAR->GetScrollPos();	/*	現在位置を取得	*/
/*	注: 0-255に設定している場合、最大位置は、	*/
/*		GetScrollRangeでは255					*/
/*		GetScrollLimitでは256として得られる		*/

設定系の操作

int nowpos = 100;
mySBAR->SetScrollRange(0, 255);	/*	選択範囲を0-255に設定	*/
mySBAR->SetScrollPos(nowpos);	/*	現在位置を100に設定	*/

初期設定としては、
OnInitDialog(ダイアログベース形式)、OnInitialUpdate(フォームビュー形式)
の中でSetScrollRangeで選択範囲を設定する。
つまみの初期位置はSetScrollPosで設定するが、省略すると0となる。

複数のスクロールバーを利用する場合でも、メッセージハンドラ関数は
共通であり、以下ハンドラ内に処理を記述する。

void sbarDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar){
	/*	コード追加ここから	*/
	/*	引数解説												*/
	/*	nSBCode 	: スクロールバーのどの部分が操作されたか	*/
	/*				  SB_LINELEFT		 左矢印クリック			*/
	/*				  SB_LINERIGHT		 右矢印クリック			*/
	/*				  SB_PAGELEFT		 左ページ領域クリック	*/
	/*				  SB_PAGERIGHT		 右ページ領域クリック	*/
	/*				  SB_THUMBTRACK		 つまみをドラッグ中		*/
	/*				  SB_THUMBPOSITION	 つまみドラッグ完了		*/
	/*				  SB_LEFT			 Homeキー押下			*/
	/*				  SB_RIGHT			 Endキー押下			*/
	/*				  SB_ENDSCROLL		 上記処理後に呼出される	*/
	/*	nPos		: ドラッグ中のつまみ位置					*/
	/*	pScrollBar	: 操作されたスクロールバーを示す			*/
	int pos = pScrollBar->GetScrollPos();
	switch(nSBCode){
		case SB_LINELEFT		: pos -=  1;  break;
		case SB_LINERIGHT		: pos +=  1;  break;
		case SB_PAGELEFT 		: pos -= 10;  break;
		case SB_PAGERIGHT		: pos += 10;  break;
		case SB_THUMBTRACK		: pos = nPos; break;
		case SB_THUMBPOSITION	: pos = nPos; break;
		case SB_LEFT			: pos = 0;    break;
		case SB_RIGHT			: pos = 255;  break;
		case SB_ENDSCROLL		: break;
		default					: break;
	}
	if(pos < 0){
		pos = 0;
	}
	if(pos > 255){
		pos = 255;
	}
	pScrollBar->SetScrollPos(pos);
	myPaint();	/*	スクロールバー位置に応じた処理	*/
	/*	コード追加ここまで	*/
	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
void sbarDlg::myPaint(void)
{
	/*	注:起動時のスクロールバー位置により画面描画が必要ならば、	*/
	/*	この関数をOnPaint()関数からもコールされるようにしておく		*/
	CScrollBar* mySBAR1 = (CScrollBar*)GetDlgItem(IDC_SCROLLBAR1);
	CScrollBar* mySBAR1 = (CScrollBar*)GetDlgItem(IDC_SCROLLBAR2);
	int pos1 = mySBAR1->GetScrollPos();
	int pos2 = mySBAR2->GetScrollPos();
	
	/*	スクロールバー位置に応じた処理(画面描画等)					*/
	
}

以降執筆予定


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です