0

我一直在尝试编写一个基于框架的 MFC 应用程序,其中包含一个对点击有简单响应的按钮。不幸的是,按钮似乎对我的操作没有反应。这是应用程序的代码:
1) OS.cpp:

#include "stdafx.h"
#include "mfc_includes.h" // some general includes like afxwin.h
#include "OS.h"
#include "MainFrm.h"
#include "button.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

BEGIN_MESSAGE_MAP(COSApp, CWinApp)
END_MESSAGE_MAP()

COSApp::COSApp() {}
COSApp theApp;
    btnHelloWorld_t my_button;
BOOL COSApp::InitInstance()
{
    INITCOMMONCONTROLSEX InitCtrls;
    InitCtrls.dwSize = sizeof(InitCtrls);
    InitCtrls.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx(&InitCtrls);
    CWinApp::InitInstance();

    CMainFrame* pFrame = new CMainFrame;
    if (!pFrame)
        return FALSE;
    m_pMainWnd = pFrame;
    pFrame->Create(L"", L"The application", WS_OVERLAPPEDWINDOW, CRect(100, 100, 500, 500));
    my_button.Create(L"Hello World!", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(30, 30, 150, 80), pFrame, btnHelloWorld_t::GetID());
    HFONT font = CreateFont(20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, L"Times New Roman");
    SendMessage(my_button.m_hWnd, WM_SETFONT, (WPARAM)font, true);
    pFrame->ShowWindow(SW_SHOW);
    pFrame->UpdateWindow();
    return TRUE;
}

2)操作系统.h:

class COSApp : public CWinApp
{
public:
    virtual BOOL InitInstance();
    afx_msg void OnAppAbout();
    DECLARE_MESSAGE_MAP()
};
extern COSApp theApp;

3)button.h(包含自定义按钮类):

#pragma once
#include "mfc_includes.h"
class btnHelloWorld_t : public CButton
{
    static const int is_button = 0x200;
    static int id;
public:
    btnHelloWorld_t()
    {
        id++;
    };
    static const int GetID()
    {
        return id;
    };
    afx_msg void Click();
    DECLARE_MESSAGE_MAP()
};

int btnHelloWorld_t::id = 0x200;

afx_msg void btnHelloWorld_t::Click()
{
    SetWindowText(L"Hello!");
}

BEGIN_MESSAGE_MAP(btnHelloWorld_t, CButton)
    ON_BN_CLICKED(btnHelloWorld_t::GetID(), &btnHelloWorld_t::Click)
END_MESSAGE_MAP()

你能告诉我有什么问题以及如何使按钮在单击后更改其文本吗?提前致谢。

4

1 回答 1

0
  1. 您的 btnHelloWorld_t::GetID() 是静态方法!!创建第一个按钮时,GetID() 返回 201。然后调用消息映射时,GetID() 返回 202。然后如果再次调用消息映射,GetID() 返回 203。然后是 204、205....

  2. 您必须在 CMainFrame 中处理 BN_CLICKED 命令,而不是 btnHelloWorld_t!如果单击该按钮,其父窗口将收到一条 WM_COMMAND 消息,其中 notifyCode == BN_CLICKED 和 controlID == 您传递给 CButton::Create() 的 ID。

于 2013-03-08T09:31:17.417 回答