[6]打造自己的“按钮激活专家”---实践性很强,得跟着练习。

学习收货。
01,这节课搞定了4个函数,实现了2个功能。
第一个功能是窗口置顶功能,很不错。
第二个功能是激活灰色按钮,很不错。

02,置顶窗口函数的实现


image.png

详细解读:
checkbox控件,没有绑定控件变量,也能得到其控件id的指针。
//想知道单选框是否被选中,需要或得其空间变量。由于没有用绑定空间变量,采用的是这种方法。
CButton pTopMostCheck = (CButton)GetDlgItem(IDC_CHECK1);
int iCheck = pTopMostCheck->GetCheck();
然后调用CButton类的方法Getcheck()
GetCheck()在CSDN中是这样说的:
CButton::GetCheck

int GetCheck( ) const;

返回值:
对于采用BS_AUTOCHECKBOX、BS_AUTORADIOBUTTON、BS_AUTO3STATE、BS_CHECKBOX、BS_RADIOBUTTON或BS_3STATE风格建立的按钮,返回值为下列之一: 值 含义
0 按钮处于未选中状态
1 按钮处于选中状态
2 按钮状态不定(仅当按钮风格为BS_3STATE或BS_AUTO3STATE时)如果按钮是其它风格,则返回0。

说明:本函数用于检测单选钮或复选框的选中状态。

下面定义的宏,很清楚了。


image.png

==========
接下来,设计到SetWindowPos教程地址:https://www.cnblogs.com/findumars/p/3948315.html

image.png

03,关于设置MFC计时器的实现:
第一步,编写OnTimer函数


image.png

第二步,启动,或者关闭。


image.png

04,枚举得到所有子窗口,得有一个回调函数。

//枚举hTopWnd的所有子窗口,也就是子控件。
EnumChildWindows(hTopWnd, EnumChildProc, NULL);


image.png

===========================


image.png

image.png

image.png

image.png

=================================================
======17分钟开始讲解置顶功能。


image.png

23分钟50秒,置顶功能讲解完毕

image.png

image.png

======================================================================


image.png

绑定一个类,
image.png

image.png

添加窗口回调函数


image.png

image.png

======================
老师视频中的代码如下:

//置顶窗口按钮---check
void CVC_AnniuDlg::OnBnClickedCheck1()
{
    // TODO:  在此添加控件通知处理程序代码
    //想知道单选框是否被选中,需要或得其空间变量。由于没有用绑定空间变量,采用的是这种方法。
    CButton *pTopMostCheck = (CButton*)GetDlgItem(IDC_CHECK1);
    int iCheck = pTopMostCheck->GetCheck();
    if (iCheck==BST_CHECKED )
    {
        SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
    }
    else
    {
        SetWindowPos(&CWnd::wndNoTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
    }


}

//按钮,开始激活或者停止。
void CVC_AnniuDlg::OnBnClickedButton1()
{
    // TODO:  在此添加控件通知处理程序代码
    static BOOL bStart = FALSE;
    if (bStart ==FALSE )
    {
        bStart = TRUE;
        GetDlgItem(IDC_BUTTON1)->SetWindowText(_T("停止!"));
        SetTimer(1, 200, NULL);
    }
    else
    {
        bStart = FALSE;
        GetDlgItem(IDC_BUTTON1)->SetWindowText(_T("开始激活!"));
        KillTimer(1);
    }
}

//EnumChildProc,放在上面
BOOL CALLBACK EnumChildProc(HWND hWnd, LPARAM lParam)
{
    if (!IsWindowEnabled(hWnd) )
    {
        EnableWindow(hWnd, true);   
    }
    return true;
}

void CVC_AnniuDlg::OnTimer(UINT_PTR nIDEvent)
{
    // TODO:  在此添加消息处理程序代码和/或调用默认值
    TCHAR szTitle[MAX_PATH] = { 0 };
    HWND hTopWnd = ::GetForegroundWindow();
    ::GetWindowText(hTopWnd, szTitle, MAX_PATH);
    SetDlgItemText(IDC_EDIT1,szTitle );

    //枚举hTopWnd的所有子窗口,也就是子控件。
    EnumChildWindows(hTopWnd, EnumChildProc, NULL);

    CDialogEx::OnTimer(nIDEvent);
}

============================
接下来的代码,我已经做好了备注方面的内容:


image.png

image.png
image.png

image.png

//置顶窗口按钮---check
void CVC_AnniuDlg::OnBnClickedCheck1()
{
    // TODO:  在此添加控件通知处理程序代码

    //想知道单选框是否被选中,需要或得其空间变量。由于没有用绑定空间变量,采用的是这种方法。
    CButton *pTopMostCheck = (CButton*)GetDlgItem(IDC_CHECK1);
    /*
    GetDlgItem用于获得指定控件ID的窗体指针
    GetDlgItem(对话框句柄,控件ID)得到句柄,再操作。
    */
    int iCheck = pTopMostCheck->GetCheck();  
    /*//然后调用CButton类的方法Getcheck()
    GetCheck()在CSDN中是这样说的:
    CButton::GetCheck

    int GetCheck( ) const;

    返回值:
    对于采用BS_AUTOCHECKBOX、BS_AUTORADIOBUTTON、BS_AUTO3STATE、BS_CHECKBOX、BS_RADIOBUTTON或BS_3STATE风格建立的按钮,返回值为下列之一: 值 含义
    0 按钮处于未选中状态
    1 按钮处于选中状态
    2 按钮状态不定(仅当按钮风格为BS_3STATE或BS_AUTO3STATE时)如果按钮是其它风格,则返回0。

    说明:本函数用于检测单选钮或复选框的选中状态。

    */
    if (iCheck==BST_CHECKED )
    {
        SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
        //,SetWindowPos教程地址:https://www.cnblogs.com/findumars/p/3948315.html

    }
    else
    {
        SetWindowPos(&CWnd::wndNoTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
    }

    
}

//按钮,开始激活或者停止。
void CVC_AnniuDlg::OnBnClickedButton1()
{
    // TODO:  在此添加控件通知处理程序代码
    static BOOL bStart = FALSE;
    if (bStart ==FALSE )
    {
        bStart = TRUE;
        GetDlgItem(IDC_BUTTON1)->SetWindowText(_T("停止!"));
        //3、启动定时器
        SetTimer(1, 200, NULL); //在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了,函数返回值就是第一个参数值1,表示此定时器的ID号。
        //SetTimer()函数使用:https://www.cnblogs.com/lingc/p/3380919.html

    }
    else
    {
        bStart = FALSE;
        GetDlgItem(IDC_BUTTON1)->SetWindowText(_T("开始激活!"));
        //4、关闭定时器
        KillTimer(1);  //在MFC程序中我们可以直接调用KillTimer(int nIDEvent)来取消定时器。1代表序号,上面setTimer里第一个参数
    }
}

//EnumChildProc,放在上面
BOOL CALLBACK EnumChildProc(HWND hWnd, LPARAM lParam)
{
    if (!IsWindowEnabled(hWnd) )
        //函数功能:该函数用于判断指定的窗口是否允许接受键盘或鼠标输入。返回值:若窗口允许接受键盘或鼠标输入,则返回非0值,若窗口不允许接受键盘或标输入,则返回值为0。备注:子窗口只有在被允许并且可见时才可接受输入。
    {
        EnableWindow(hWnd, true);   
        //该函数允许/禁止指定的窗口或控件接受鼠标和键盘的输入,当输入被禁止时,窗口不响应鼠标和按键的输入,输入允许时,窗口接受所有的输入。
        //bEnable:定义窗口是被允许,还是被禁止。若该参数为TRUE,则窗口被允许。若该参数为FALSE,则窗口被禁止。
        // 如果窗口此前已禁用,则返回值是非零。 返回值是0,则窗口先前启用或错误。若想获得更多的错误信息,可调用GetLastError函数。
    }
    return true;
}


//MFC中定时器OnTimer函数的使用:https://blog.csdn.net/qq_33723441/article/details/54599022
//2、编写OnTimer函数
void CVC_AnniuDlg::OnTimer(UINT_PTR nIDEvent)
{
    // TODO:  在此添加消息处理程序代码和/或调用默认值
    TCHAR szTitle[MAX_PATH] = { 0 };
    //GetForegroundWindow获取一个前台窗口的句柄(用户当前工作的窗口)
    HWND hTopWnd = ::GetForegroundWindow();
    ::GetWindowText(hTopWnd, szTitle, MAX_PATH);
    SetDlgItemText(IDC_EDIT1,szTitle );

    //枚举hTopWnd的所有子窗口,也就是子控件。
    EnumChildWindows(hTopWnd, EnumChildProc, NULL);
    /*
    BOOL WINAPI EnumChildWindows(  _In_opt_  HWND hWndParent,  _In_      WNDENUMPROC lpEnumFunc,  _In_      LPARAM lParam );
    hWndParent: 需要枚举父窗口的句柄,如果此值为空EnumWindows函数
    lpEnumFunc: 定义回调函数的指针 (回调函数名)
    lParam: 传递给回调函数的值

    */

    CDialogEx::OnTimer(nIDEvent);
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容