我使用Visual Studio编辑器创建一个简单的基于对话框的应用程序,并在默认的CDialog加入三个按钮(通过拖动和丢弃它们)。

默认OK和Cancel按钮是有太多。

我想将焦点设置到按钮1当我点击按钮3。

我为MUY按钮设置属性平为true在属性。

我编码这样的:

void CbuttonfocusDlg::OnBnClickedButton3()
{
    // TODO: Add your control notification handler code here
    GetDlgItem(IDC_BUTTON1)->SetFocus();

    Invalidate();

}

但是,在按钮1的畦从不绘制。插入符号(虚线指示焦点)如果我按下TAB点击之前的任何时间仅绘制按钮3

我想按钮看起来完全一样照顾我点击它。表示按钮内部的虚线编程,将是一个加。

我想什么:

“http://i33.tinypic.com/11t8pkl.png”

我得到什么:

“http://i37.tinypic.com/160q5hw.png”

有帮助吗?

解决方案 3

此绘制按钮周围的粗边框:

static_cast<CButton*>(GetDlgItem(IDC_BUTTON1))->SetButtonStyle(BS_DEFPUSHBUTTON);

一个更优雅的方式来做到这将是在CbuttonfocusDlg以限定一个CButton构件变量并将其关联到IDC_BUTTON1控制,然后调用

this->m_myButton.SetButtonStyle(BS_DEFPUSHBUTTON);

这使得按钮到我设置的焦点默认按钮,但请注意,当焦点转到控制(在对话框内)不是一个按钮,默认的按钮是一次原来的默认按钮在对话框资源集,在这种情况下,“确定”按钮。

其他提示

使用WM_NEXTDLGCTL

请参阅雷蒙陈水扁的“如何将焦点设置在对话框框“

void SetDialogFocus(HWND hdlg, HWND hwndControl)
{
    SendMessage(hdlg, WM_NEXTDLGCTL, (WPARAM)hwndControl, TRUE);
}

通过调用UpdateWindow,按钮被焦点改变之前重绘生效。的的Invalidate应该是本身就足以,该窗口将得到重新绘制当一切平息下来。

我下面乔尔的建议。但与在该链路中使用的API略有不同,我的一个是:

PostMessage的(WM_NEXTDLGCTL,(WPARAM)(pwnd-> GetSafeHwnd()),TRUE);

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top