UpdateData(TRUE); //画面で入力されている値を変数にセットする
xxx = m_xxx; //変数から値を取り出す
…
m_xxx = …; //変数に値を設定
UpdateData(FALSE); //変数の値を画面に反映する
◆スタティックコントロールも、IDを変更するとCString型の変数を追加できる。
CString Str;
CEdit *Ed1=(CEdit *)GetDlgItem( エディットコントロールのID );//ポインタ取り出し
Ed1->GetWindowText(Str); //エディットの内容を取り出し
Ed1->SetWindowText(Str); //エディットの内容を設定
Ed1->SetReadOnly(TRUE); //読み取り専用に指定
Ed1->SetReadOnly(FALSE); //読み書き可能に指定
CButton *Btn = (CButton*)GetDlgItem(ボタンのID);
Btn->EnableWindow(TRUE); //有効
Btn->EnableWindow(FALSE);//無効
Btn->ShowWindow(TRUE); //表示する
Btn->ShowWindow(FALSE); //表示を隠す
CSelRadio SelRadio; //ラジオボタンを配置したダイアログボックス
SelRadio.m_rd1 = SRadioID; //ラジオボタン番号初期値設定
if (SelRadio.DoModal() == IDOK)
SRadioID = SelRadio.m_rd1; //選択されたラジオボタン番号取得
HBRUSH CXXXXXDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(pWnd->GetDlgCtrlID() == IDC_STATIC_XYZ){ //IDをチェックする
pDC->SetTextColor(RGB (0xff, 0, 0));
pDC->SetBkMode(TRANSPARENT); //背景をそのまま残す(←→OPAQUE)
CString WStr;
pWnd->GetWindowText(WStr);
if(WStr == "パターンA") //表示文字列で判断するとき
pDC->SetTextColor(RGB (0xff, 0, 0));
else
pDC->SetTextColor(RGB (0, 0, 0xff));
}
return hbr;
}
◆パラメタnCtlColor
CTLCOLOR_BTN ボタン コントロール
CTLCOLOR_DLG ダイアログ ボックス
CTLCOLOR_EDIT エディット コントロール
CTLCOLOR_LISTBOX リスト ボックス コントロール
CTLCOLOR_MSGBOX メッセージ ボックス
CTLCOLOR_SCROLLBAR スクロール バー コントロール
CTLCOLOR_STATIC 静的コントロール
CWnd* pic = GetDlgItem(IDC_PICT);
pic->SetWindowPos(NULL, 10, 10, 642, 482, SWP_DRAWFRAME | SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOZORDER);
◆nFlags
SWP_DRAWFRAME ウィンドウの周りにフレームを描画
SWP_FRAMECHANGED ウィンドウのサイズが変化しない場合も、WM_NCCALCSIZEメッセージを送る
SWP_HIDEWINDOW ウィンドウを非表示にする
SWP_NOACTIVATE ウィンドウをアクティブにしない
SWP_NOCOPYBITS クライアント領域のすべての内容を廃棄する
SWP_NOMOVE 現在位置を保持する(引数xとyは無効)
SWP_NOOWNERZORDER オーナーウィンドウのZ順を変えない
SWP_NOREDRAW 変更内容を再描画しない
SWP_NOSENDCHANGING WM_WINDOWPOSCHANGING メッセージを受けとらない
SWP_NOSIZE 現在のサイズを保持(引数cxとcyは無効)
SWP_NOZORDER 現在の順序を保持(引数pWndInsertAfterは無効)
SWP_SHOWWINDOW ウィンドウを表示する
//コンボボックスのリスト項目設定
int WCnt;
CString WStr;
m_kind.ResetContent();
for(WCnt = 0; WCnt < 2; WCnt++){
WStr.LoadString(IDS_DKIND1 + WCnt);
m_XXX(コンボボックスのデータ変数).InsertString(-1, WStr);
}
//クリック時のイベント内
POINT pt;
RECT rc;
int X, Y;
GetCursorPos(&pt); //マウスポインタの位置取得
ScreenToClient(&pt); //スクリーン座標→クライアント座標
X = pt.x;
Y = pt.y;
GetDlgItem(コントロールのID)->GetWindowRect(&rc); //コントロールの位置取得
pt.x = rc.left;
pt.y = rc.top;
ScreenToClient(&pt); //スクリーン座標→クライアント座標
X -= pt.x;
Y -= pt.y;
◆コントロールのプロパティで「通知」にチェックが必要なのだ。
一行目\n二行目
BOOL CXXXXXDlg::OnHelpInfo(HELPINFO* pHelpInfo)
{
static DWORD rgmapCHID[] = {
IDC_START, 10, //コントロールのID,コンテキストID,
IDC_STOP, 11,
・
・
・
0,0 //ここで最後
};
return ::WinHelp( (HWND)pHelpInfo->hItemHandle,
AfxGetApp()->m_pszHelpFilePath,HELP_WM_HELP,
(DWORD)(LPVOID)rgmapCHID);
}
void CSelEdit::OnLButtonDown(UINT nFlags, CPoint point)
{
CEdit::OnLButtonDown(nFlags, point);
//テキストを全選択
SetSel(0, -1, false);
}
●ダイアログクラスのヘッダファイル
CSelEdit AutoSelEdit;
WNDPROC oldEditProc; //CEditのコールバック関数を格納する場所
WNDPROC* GetSuperWndProcAddr(); // オーバーライドする
…
●ソースファイル
BOOL CXXXXXDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// このダイアログ用のアイコンを設定します。フレームワークはアプリケーションのメイン
// ウィンドウがダイアログでない時は自動的に設定しません。
SetIcon(m_hIcon, TRUE); // 大きいアイコンを設定
SetIcon(m_hIcon, FALSE); // 小さいアイコンを設定
//エディットボックスをサブクラス化(IDを指定したコントロールが派生元のクラスになる)
AutoSelEdit.SubclassDlgItem(IDC_EDIT1, this);
…
}
…
//GetSuperWndProcAddr のオーバーライド
WNDPROC* CXXXXXDlg::GetSuperWndProcAddr()
{
return &oldEditPorc;
}
void CXXXXX::OnSetfocus()
{
HWND hWnd = GetDlgItem(IDD_XXXXX)->m_hWnd;
HIMC hIMC = ImmGetContext(hWnd); //IMEのコンテキスト取得
ImmSetOpenStatus(hIMC, false); //IMEをOFFに設定 ONにする場合はTrueを指定
ImmReleaseContext(hWnd, hIMC); //コンテキスト解放
}
BEGIN_MESSAGE_MAP(CXXXXXDlg, CDialog)
//{{AFX_MSG_MAP(CXXXXXDlg)
ON_WM_TIMER()
ON_WM_DESTROY() //など…
ON_CONTROL_RANGE(EN_SETFOCUS, IDC_CONTROL1, IDC_CONTROL5, OnSetfocusControl)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
…
void CXXXXXDlg::OnSetfocusControl(UINT uID)
{
… //コントロールIDがuIDとして渡される
}
◆通知コードに指定するのは、他にBN_CLICKEDなど。他にも、ON_COMMAND_RANGEやON_UPDATE_COMMAND_UI_RANGEマクロがある。知っていると便利だな。
ON_COMMAND_RANGE(
id1, //先頭ID
id2, //終わりのID
memberFxn) //コマンドがマップされるメッセージ処理関数名
ON_UPDATE_COMMAND_UI_RANGE(
id1, //先頭ID
id2, //終わりのID
memberFxn) //コマンドがマップされる更新メッセージ処理関数名
void CXXXXXDlg::OnButton1()
{
if(ClickFlag){ //凹んでいるとき
GetDlgItem(IDC_BUTTON1)->SendMessage(BM_SETSTATE, FALSE, 0); //元に戻す
ClickFlag = false;
}else{
GetDlgItem(IDC_BUTTON1)->SendMessage(BM_SETSTATE, TRUE, 0); //凹ませる
ClickFlag = true;
}
}
◆このままだと、許可しない値を入力したままウィンドウを閉じたりしても、終了できないので、EN_KILLFOCUSメッセージを定義して、範囲を超えていたら修正するといいかも。
CSpinButtonCtrl m_SpinBtn;
…
BOOL CXXXXXDlg::OnInitDialog()
{
…
m_SpinBtn.SetRange(0, 1000); //範囲を0から1000とする
m_SpinBtn.SetPos(500); //スピンボタンの値をセットする場合
CToolBar WndToolBar;
BOOL CXXXXXDlg::OnInitDialog()
{
…
if(WndToolBar.Create(this) && WndToolBar.LoadToolBar(IDR_TOOLBAR)){
CRect rct;
GetClientRect(rct); //ダイアログのウィンドウサイズ
CSize ToolBarSize;
ToolBarSize = WndToolBar.CalcFixedLayout(false, true); //ツールバーの高さを取得
WndToolBar.MoveWindow(0, 0, rct.Width(), ToolBarSize.cy); //高さを設定する
}
…
◆サイズをセットしないと0になっているらしくて見えないのだ。変なのー。
void CXXXXXDlg::OnSelchangeList()
{
UpdateData(true);
//選択項目のチェックを確認する場合
int Idx = m_ListBox.GetCurSel();
if(m_ListBox.GetCheck(Idx)){ //チェックON
…
}
//全項目のチェックを確認する場合
int Max = m_ListBox.GetCount();
for(int Cnt = 0; Cnt < Max; Cnt++){
if(m_ListBox.GetCheck(Cnt)){ //チェックON
…
}else{
…
}
}
}
◆リストコントロールでやる方法もあるみたいだけど、クリックした時点でチェックのON/OFFが取れなかったよ。こっちの方が簡単だしね。
void CXXXXX:OnDeltaposSpinXXXXXXX(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
//値の調整
if(pNMUpDown->iDelta > 0){
//値をインクリメント
}else if(pNMUpDown->iDelta < 0){
//値をデクリメント
}
*pResult = 0;
}
◆このとき、スピンボタンに対して最初にSetRangeを呼んでおくと、スピンボタンの上側がプラス、下側がマイナスになるのだな。SetRangeを呼ばないと逆になる。なぜかしらー。
void CXXXXX:Dlg::OnHdnItemclickResultList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMHEADER phdr = reinterpret_cast<LPNMHEADER>(pNMHDR);
*pResult = 0;
//ソートマークを消す
m_XXXList.ClearDispSortMark();
}