小编Bar*_*ani的帖子

即使添加了ON_COMMAND处理程序,菜单项也会保持禁用状态

我使用Visual Studio 2013创建了一个简单的拆分窗口应用程序.有两个视图,一个视图由default-view-class组成,另一个视图由from-view-class派生而来CScrollView.

/////////////////////////
// MainFrm.cpp

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,CCreateContext* pContext)
{

    split_wnd.CreateStatic(this,1,2);

    CRect cr;
    GetClientRect(&cr);

    split_wnd.CreateView(0,0,RUNTIME_CLASS(CProjectMainView),CSize(cr.Width()/2,cr.Height()),pContext);

    split_wnd.CreateView(0,1,RUNTIME_CLASS(CMyCustomView),CSize(cr.Width()/2,cr.Height()),pContext);

    return true;

}
Run Code Online (Sandbox Code Playgroud)

这个分离器工作正常.

当我尝试将ON_COMMAND处理程序添加到其中一个菜单项时,会出现问题.如果我将ON_COMMAND处理程序放在default-view-class中则没有问题.菜单项点击很好,处理程序工作.

但是,如果我将ON_COMMAND处理程序放在custom-view-class中,则菜单项根本不会启用.

我相信我已经做了一切,在我的自定义视图类中正确实现了消息映射.

/////////////////////////
// CMyCustomView.h

class CMyCustomView:public CScrollView
{
public:
    DECLARE_DYNCREATE(CMyCustomView)
    CMyCustomView();
    ~CMyCustomView();
    virtual void OnDraw(CDC* /*pDC*/);
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    virtual void OnInitialUpdate();


public:
    DECLARE_MESSAGE_MAP()
    afx_msg void OnMenuIdTestMessageMap();
};
Run Code Online (Sandbox Code Playgroud)

DECLARE_MESSAGE_MAP()肯定是有在MyCustomView.h当然,我已经添加BEGIN_MESSAGE_MAP,END_MESSAGE_MAP()对在MyCustomView.cpp文件.

/////////////////////////
// CMyCustomView.cpp

BEGIN_MESSAGE_MAP(CMyCustomView,CScrollView)
    ON_COMMAND(MENU_ID_TEST_MESSAGE_MAP,&CMyCustomView::OnMenuIdTestMessageMap)
END_MESSAGE_MAP()


void CMyCaptureView::OnMenuIdTestMessageMap()
{
    // TODO: Add your …
Run Code Online (Sandbox Code Playgroud)

events mfc handler menuitem message-map

3
推荐指数
1
解决办法
98
查看次数

在 CString::Format 中使用 CString 对象

我可以用CStringCString::Format如下:

CString text = _T("text");
CString format;
format.Format(_T("%s"), text);
Run Code Online (Sandbox Code Playgroud)

在 MFC 源文件和 MFC 书籍中可以看到相同的方法。例如:

//From MFC file:
//C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\src\mfc\
//    afxeditbrowsectrl.cpp
BOOL CMFCEditBrowseCtrl::OnIllegalFileName(CString& strFileName)
{
    CString strError;
    CString strMessage;
    ...
    strMessage.Format(_T("%Ts\r\n%Ts"), strFileName, strError);
    //I don't know what is the `T` in `"%Ts"` !
    ...
}
Run Code Online (Sandbox Code Playgroud)

然而,其他 MFC 源文件使用LPCTSTR强制转换。例子:

format.Format(_T("%s"), (LPCTSTR)text);
Run Code Online (Sandbox Code Playgroud)

演员表是强制性的吗?

c++ mfc

3
推荐指数
1
解决办法
9757
查看次数

用于运算符重载的Lambda表达式

是否可以为重载运算符编写lambda表达式?

例如,我有以下结构:

struct X{
    int value;
    //(I can't modify this structure)
};
Run Code Online (Sandbox Code Playgroud)

X需要==运营商

int main()
{
    X a = { 123 };
    X b = { 123 };
    //[define equality operator for X inside main function]
    //if(a == b) {}
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

==运算符可以定义为bool operator==(const X& lhs, const X& rhs){...},但这需要添加单独的函数,并且我的比较仅在特定函数内有效.

auto compare = [](const X& lhs, const X& rhs){...}将解决问题.我想知道我是否可以将这个lambda编写为运算符.

c++ visual-studio

3
推荐指数
1
解决办法
366
查看次数

如何获得使用BTNS_AUTOSIZE样式创建的工具栏按钮的实际大小?

我创建了一个包含以下样式的工具栏:

DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS
                | CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_NORESIZE
                | TBSTYLE_FLAT | TBSTYLE_LIST;
Run Code Online (Sandbox Code Playgroud)

然后我用纯文本按钮填充工具栏:

bool InsertButton(int Index, int CmdId, BYTE Style, BYTE State,
                  int TxtIdx, DWORD_PTR lParam)
{
    TBBUTTON tbb = { 0 };
    tbb.idCommand = CmdId;
    tbb.fsStyle = Style;    // == BTNS_AUTOSIZE | BTNS_DROPDOWN
    tbb.fsState = State;
    tbb.iBitmap = I_IMAGENONE;
    tbb.iString = TxtIdx;
    tbb.dwData = lParam;

    return (bool)CToolBarCtrl::InsertButton(Index, &tbb);
}
Run Code Online (Sandbox Code Playgroud)

填充工具栏后,我想获得其按钮的实际大小.但GetButtonInfo返回零大小.

int GetBtnSize(int Idx) const
{
    TBBUTTONINFO tbbi = { sizeof(tbbi), …
Run Code Online (Sandbox Code Playgroud)

windows winapi mfc visual-c++ common-controls

3
推荐指数
1
解决办法
108
查看次数

我什么时候应该使用VS2015平台工具集V140_XP?

我想从VS2010切换到VS2015但是关于V140_XP的文档对我来说并不清楚.我有两个问题:

  1. 我使用静态库(/ MT).所以我不需要vcruntime140.dll或任何其他以前的运行时库.我应该将平台工具集设置为V140_XP以在Windows XP中运行我的应用程序吗?

  2. 如果我没有将平台工具集设置为XP,我的应用程序是否会在Windows 7及更高版本上运行正常?

c windows winapi visual-studio

2
推荐指数
1
解决办法
3064
查看次数

为什么GetFileAttributesW(L"C:")返回FILE_ATTRIBUTE_REPARSE_POINT?

通常,GetFileAttributesW(L"C:")return 0x10(FILE_ATTRIBUTE_DIRECTORY),这是合理的.

在某些情况下,GetFileAttributesW(L"C:")将返回0x2416(FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT | FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)

我想知道是什么让它发生以及如何摆脱它.这个问题使得boost::filesystem::canonical无法正常工作.你有什么主意吗?

c++ windows winapi boost

2
推荐指数
1
解决办法
921
查看次数

SDL2 + Win32 API 菜单栏单击事件不起作用

我目前正在 Visual C/C++ 中使用 SDL2 + windows.h 库开发 GameBoy/GameBoyColor 模拟器以获取附加功能。我已成功将菜单项附加到 SDL 创建的窗口,但是在单击菜单项时尝试处理窗口发送的消息时遇到了麻烦...带有窗口菜单项的正在运行的应用程序的图像

在我的设计中,我决定创建一个单独的源文件,其命名空间包含各种程序实用程序(例如窗口管理功能)。因此,我创建了一个名为的函数getMenuEvent(),它由窗口实例的消息循环组成,从技术上讲,它应该WndProc()在同一名称空间中调用我定义的函数来查看其中的内容wParam......

这是我编写的实用程序命名空间源文件

HWND getSDLWinHandle(SDL_Window* win)
{
    SDL_SysWMinfo infoWindow;
    SDL_VERSION(&infoWindow.version);
    if (!SDL_GetWindowWMInfo(win, &infoWindow))
    {
        std::cout << "test";
        return NULL;
    }
    return (infoWindow.info.win.window);
}

//Initializes the native windows drop down menu elements of the window
void ActivateMenu(HWND windowRef)
{
    hMenuBar = CreateMenu();
    hFile = CreateMenu();
    hEdit = CreateMenu();
    hHelp = CreateMenu();

    AppendMenu(hMenuBar, MF_POPUP, (UINT_PTR)hFile, "File");
    AppendMenu(hMenuBar, MF_POPUP, (UINT_PTR)hEdit, "Edit");
    AppendMenu(hMenuBar, MF_POPUP, (UINT_PTR)hHelp, "Help"); …
Run Code Online (Sandbox Code Playgroud)

c++ winapi emulation menubar sdl-2

2
推荐指数
1
解决办法
2176
查看次数

如何使用 pywin32 知道窗口是否最大化?

我需要使用 pywin32 检查窗口是否最大化。我使用的是 Windows 10 机器。

我已经查看了文档,但找不到直接的解决方案,有任何线索吗?

python winapi pywin32

2
推荐指数
1
解决办法
2041
查看次数

如何知道何时调用CWnd的Create函数?

我写了一个包含网格控件的类.我想通过调用Create函数创建自定义网格类.

有没有办法可以赶上这个活动?

mfc message

1
推荐指数
1
解决办法
2595
查看次数

评估c中if语句中的表达式

假设我写了一个代码:

int main()
{
    int i,a=2147483647;

    if((2*a)<0)
        printf("hello");
    else
    printf("world");
}
Run Code Online (Sandbox Code Playgroud)

输出是世界的.但对于 :

int main()
{
    int i,a=2147483647;
    if((a+a)<0)
        printf("hello");
    else
        printf("world");
}
Run Code Online (Sandbox Code Playgroud)

输出是hello.

这是怎么回事?
存储在内存中的2*a和a + a的值在哪里(内存位置的数据类型是什么?)

c

1
推荐指数
1
解决办法
130
查看次数