MFC。具有不同处理程序的 CButton 类的多个对象

问题描述 投票:0回答:1

如何正确使用继承类的对象,例如CButton类?

当我使用一个简单的按钮时,我可以使用它自己的 OnBnClickedButtonXXX() 方法,我可以在其中编写我想要的任何内容。我在那里写的所有内容都只涉及这个 XXX 按钮。 但就我而言,由于 OnLButtonDownOnLButtonUp 方法,我正在创建一个从 CButton 类 (CButtonHold) 继承的按钮类,并且我想将其用于具有不同目的的多个按钮。我如何为 CButtonHold 类编写自己的方法,例如 OnLButtonDownXXX() ,在其中我可以描述特定按钮 XXX 当我按下和释放时的行为?

例如,这就是我设法做到的:我想在 OnLButtonDown 调用时使用不同的参数调用自己的异步方法 AfxBeginThread ,并在 OnLButtonUp 调用时停止线程。该按钮将驱动步进电机,我需要向每个按钮发送不同的参数。我的程序的简单结构:

我在全局初始化两个线程标志:

bool thrdOne = true, thrdTwo = true;
CWinThread* motorThread;

课堂实施:

class CButtonHold : public CButton
{
    public:
    CButtonHold(int val, bool thrd);
    bool thrd;
    int val;
    ...
}

在对话框构造函数中,我初始化了我的 CButton 对象(愚蠢但有效)。它使我的 CButtons 独一无二:

CButtonHold btnX(1, thrdOne), btnY(2, thrdTwo);

在对话类中:

static UINT btnStartThread(LPVOID arg)
{
    CButtonHold* button = (CButtonHold*)arg;

    while (button->btnThread)
    {
        if(button->val == 1) //doing something....
        else //doing something else....
    }

    AfxEndThread(0, TRUE);
    return 0;
}

void callThread(CButtonHold* button)
{
    if (button->btnThread)
        motorThread = AfxBeginThread(btnStartThread, button, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
} 

void stopThread(CButtonHold* button)
{
    button->btnThread = false;
}

写这样的废话是正常的还是有更优雅的方法来处理同一类的特定对象?这可行,但我感觉有些不对劲。我的问题有一个不好的例子,但我希望你能明白问题是什么。谢谢!

c++ windows class inheritance mfc
1个回答
0
投票

最简单的方法是将您自己的

WM_COMMAND
或通知消息从
CButtonHold
类发送到按钮窗口的父级。

通常在 UI 中,父对话框/窗口对控件的操作做出反应,并决定单击哪个按钮后会发生什么。

© www.soinside.com 2019 - 2024. All rights reserved.