SetFocus()怎么使用

SetFocus()怎么使用,第1张

控件名+"SetFocus"

比如:

Private Sub Command1_Click()

Text2Text = Text1Text

End Sub

运行完,焦点会停留在command1按钮上,

但是改为:

Private Sub Command1_Click()

Text2Text = Text1Text

Text1SetFocus

End Sub

运行后,焦点就在text 1 上了。

这就是SetFocus的用法。

如果有编辑框的对象的话可以如下:

CEdit m_myEdit;//这个是编辑框的对象

m_myEditSetSel(0, -1);

m_myEditClear();//清空数据

m_myEditGetFocus();//再次获得焦点

如果没有编辑框的对象,可以通过编辑框的ID来获得

通过GetDlgItem(IDC_XXX)函数来获得

我的做法是这的,在工程主对话框中添加一个CEdit和CButton,意思是当编辑框获得焦点时,输入内容,然后按下回车,焦点转到按钮上,当按钮被按下的那一刻,同时调用了CEdit子类的OnKillFocus函数以下是具体内容:

1、为CEdit添加一个派生类CBaseEdit,然后添加一个OnKillFocus()函数

2、为OnKillFocus写入以下代码:

#include "TestDlgh"//把当前主对话框作为CBaseEdit的父窗口

。。。

void CBaseEdit::OnKillFocus(CWnd pNewWnd)

{

CEdit::OnKillFocus(pNewWnd);

// TODO: Add your message handler code here

MessageBox("CEdit的OnKillFocus函数被调用了!");

CTestDlg parent = (CFocusDlg)GetParent();//创建一个父窗口的指针对象

CString str;

GetWindowText(str);

parent->m_str = str;//当前编辑框中的内容赋给主对话框类成员变量m_str

parent->m_btnSetFocus();

}

3、主对话框CTestDlg类中,为按钮添加消息响应函数

#include "BaseEdith"

CString m_str;

CButton m_btn;

CBaseEdit m_edit;

。。。

void CTestDlg::OnButton1()

{

// TODO: Add your control notification handler code here

MessageBox(m_str);

}

5、在主对话框类中添加PreTranslateMessage消息响应函数

BOOL CTestDlg::PreTranslateMessage(MSG pMsg)

{

// TODO: Add your specialized code here and/or call the base class

if(pMsg==NULL) return false;

const HWND hwnd=pMsg->hwnd;

if(pMsg->message==WM_KEYDOWN&&pMsg->wParam==13){

SetTheFocus();//按下回车键时调用该函数

}

return CDialog::PreTranslateMessage(pMsg);

}

6、在主对话框类添加一个自定义函数SetTheFocus

void CTestDlg::SetTheFocus()

{

HWND hwnd=::GetFocus();

int iID=::GetDlgCtrlID(hwnd);

switch(iID)//判断当前哪个控件获得焦点

{

case IDC_EDIT1:

m_btnSetFocus();

break;

case IDC_BUTTON1:

::PostMessage(this->GetSafeHwnd(),WM_COMMAND,iID,(UINT)hwnd);

break;

}

}

在你程序要显示的那个类里面添加变量CEdit pedit;在要显示的按钮里pedit = new CEdit();

CRect rect;

rectbottom=80;

rectleft=50;

rectright=200;

recttop=50;

pedit->Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER,rect, this, 1);

在交换数据的按钮了char a[100];

pedit->GetWindowText(a,pedit->GetWindowTextLength()+1);//取文本

CString m;

mFormat("%s",a);

pedit->SetWindowText("17987898");//输出文本

MessageBox(m); 参数你可以自己调,那个风格的ID我没找到,这个是网上的例子带的参数。你自己在找找rect是修改显示区域的如果你需要数值,请自己类型转换吧。 还有就是 其实不一定要动态创建,可以提前做好隐藏了,需要的时候显示,这样简单多了GetDlgItem(编辑框ID)->ShowWindows(SW_SHOW);//显示 隐藏式SW_HIDE

先来看一下你上面说的是哪儿的错误哈:

首先GetDlgItem(IDC_EDIT1)获取了ID为IDC_EDIT1也就是编辑框CEdit类的对象的指针,继承了CWnd类,函数GetFocus是CWnd中的静态函数,来看一下函数原型:static CWnd PASCAL GetFocus( );

返回值是CWnd 类型的,也就是说如果当前对话框或是控件被focus,那么就返回这个对话框或控件的指针。而你在if语句中将这个指针返回值当作了判断条件,所以呢,如果指针为NULL则if不执行,否则if就会执行。因为CEdit是一个控件类,其父窗口是有的,就是你那个计算器的主窗口。对于CEdit控件类的父类CWnd中的成员变量并不是独立存在的,而是根据父窗口类中的成员变量动态改变的,也可以说是临时的(MSDN上的说法是temporary)。所以当程序运行的时候,无论是第一个编辑框被focus或是第二个编辑框被focus,只要主对话框被focus了,那么调用GetDlgItem(IDC_EDIT1)->GetFocus())还是调用GetDlgItem(IDC_EDIT2)->GetFocus())还是直接调用this->GetFocus()它们的返回值都是一样的,就是父对话框的指针。当然不为NULL,所以第一个if就会执行。所以就显示在第一个编辑框了。

建议多看看MSDN上的类库的说明,最具权威的说明和用法,你会收获很多。。。

祝你好运!

具体改的话,按照你的思路可以这么改:

先在主对话框类中增加一个int型的标识,假如是nEditFlag。

//nEditFlag = 0 表示编辑框都没被focus 等于1表示IDC_Edit1被focus 等于2表示IDC_EDIT2被focus

初始化函数OnInitDialog中初始化为:nEditFlag = 0;

为IDC_EDIT1和IDC_EDIT2关联消息映射,为它们各自增加EN_SETFOCUS消息,这个消息的含义是当鼠标点到IDC_EDIT1或IDC_EDIT2时自动发出EN_SETFOCUS消息,判断消息属于哪个编辑框,然后交给相应的消息处理函数(默认为OnSetfocusEdit1()或OnSetfocusEdit2())来处理,在OnSetfocusEdit1消息处理函数中将nEditFlag设为1,在OnSetfocusEdit2消息处理函数中将nEditFlag设为2。

然后再为主对话框中添加WM_LBUTTONDOWN消息,该消息的含义是当对主对话框中的空白地方鼠标左键落下的时候自动触发该消息,然后交给相应的处理函数来处理,默认处理函数为OnLButtonDown(),在该处理函数中这样写:

this->SetFocus();

nEditFlag = 0;

这样就差不多了,当单击按钮的时候只要判断一下nEditFlag的值就可以了。

重载OnOK函数。当在对话框上按回车时,会自动调用OnOK函数。在这个函数内部判断当前焦点控件是不是指定的输入框控件,若是,则调用GetDlgItem获取其内输入的数据。

void CTestDlg::OnOK()

{

// TODO: Add extra validation here

CWnd pwnd = GetFocus(); /获得当前焦点窗口指针/

if ( pwnd == GetDlgItem(IDC_EDIT1) )/看焦点是不是在指定编辑框上/

{

UpdateData(TRUE); /若是,则更新所有数据。/

CString strEdit1; /用来保存输入数据的变量。当然可以不要它,而使用对应成员变量来保存数据/

GetDlgItemText(IDC_EDIT1, strEdit1);/当然,也可以在这里手动更新成员变量,而其他成员变量的值不变/

((CEdit )pwnd)->SetSel(0,-1);/选中编辑框中所有文字,可选/

//MessageBox(strEdit1); /显示输入的信息/

}

/若要对其他编辑框进行处理,再模仿上面的if块添加代码即可/

// CDialog::OnOK(); /默认的OnOK函数,不再需要/

}

以上就是关于SetFocus()怎么使用全部的内容,包括:SetFocus()怎么使用、MFC中如何在编辑框输入数据按下确定后清空编辑框,等待下次输入、VC 当EDIT失去焦点的同时,发送回车事件。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9586265.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存