标签: wtl

在WTL中实现自定义绘制控件中的滚动

我已经创建了我自己的自定义绘制列表与复选框WTL,我想让它现在可滚动,事情是,我正在子类化我绘制的静态文本控件..我不知道静态控件是否支持任何滚动方式..无论如何我的问题是如何使我的自定义控件可滚动,我是否必须自己强制机制?

winapi wtl atl visual-c++

3
推荐指数
2
解决办法
1188
查看次数

PtInRect vs儿童窗口

我已经看到了人们DrawFrameControl一起使用的情况PtInRect(鼠标位置被测试到框架控件的矩形),以模拟控件(如按钮)的效果.你为什么要这样做,而不是使用子窗口?

使用此技术的示例是此对接框架,其中对接窗口的关闭按钮不是物理窗口.

对于我正在编写的应用程序,我使用的列表视图控件最多可容纳1000个项目.每个项目将保持,比方说,10个按钮.所有按钮都是自定义绘制的

它会被认为是一种更有效(和更快)的方法来使用这种PtInRect机制吗?

winapi mfc wtl

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

COM是WTL的必需品吗?

在每个WTL示例中,CoInitialize都被称为第一个函数WinMain.我知道WTL基于ATL,它与COM密切相关,但正如我所看到的,WTL程序很容易不能使用任何COM代码(不是吗?).

更令人困惑的是CComCriticalSection,尽管名称如此,ATL仍然有与COM无关的类.

所以我的问题是:是否有必要调用CoInitializeWTL程序,即使没有明确使用COM?

com winapi wtl atl

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

CStatic问题的背景颜色

我在使用WTL设置CStatic的背景颜色时遇到问题(我猜我的MFC也有同样的问题)

我有一个黑色背景的窗口,它有一个源自CStatic的控件.我正在通过WM_CTLCOLORSTATIC消息设置颜色.我基本上工作,但控件中有文字的部分显示为白色.

这是回调中的代码:

LRESULT CReportResults::OnCtrColorStatic(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
    if ((HWND)lParam == m_wndLoadingLabel.m_hWnd)
    {
        HDC     hDC = (HDC)wParam;

        SetBkColor(hDC, APP_COLOR_BACKGROUND);
        SetTextColor(hDC, APP_COLOR_TEXT);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这就是它最终在屏幕上看起来的样子.控件本身比它中的文本大,但我不知道如何让其余的控件用黑色背景绘制.看起来将背景颜色设置为黑色只会影响文本显示的区域.关于我可能做错的任何想法?

这就是它的样子

c++ winapi mfc wtl

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

带有状态文本的WTL CListViewCtrl

我有一个Windows模板库CListViewCtrl在报告模式(所以有一个2列的标题)与所有者数据集.此控件显示搜索结果.如果没有返回结果,我想在列表框区域中显示一条消息,表明没有结果.是否有捷径可寻?你知道任何现有的控件/示例代码(我找不到任何东西).

否则,如果我将控件子类化以提供此功能,那么这将是一个好方法吗?

c++ wtl

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

WTL子窗口事件处理

我正在开发窗口应用程序,因为我在左侧和右侧有2个子窗口.我想分别处理两个窗口的输入事件.怎么实现呢?

我的代码:

class EditorWindow : public DxWindow
{
public:
    CSplitterWindow m_vSplit;
    CPaneContainer m_lPane;
    CPaneContainer m_rPane; 
    PropertyDialog m_propertyWnd;
    DECLARE_WND_CLASS(_T("Specific_Class_Name"))

    BEGIN_MSG_MAP(EditorWindow)
        MESSAGE_HANDLER(WM_CREATE, OnCreate)
        MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
        MESSAGE_HANDLER(WM_LBUTTONDOWN, KeyHandler)
        MESSAGE_HANDLER(WM_KEYUP, KeyHandler)
        MESSAGE_HANDLER(WM_LBUTTONDOWN, KeyHandler)
    END_MSG_MAP()

    LRESULT OnCreate(UINT, WPARAM, LPARAM, BOOL&)
    {
        CRect rcVert;
        GetClientRect(&rcVert);     
        m_vSplit.Create(m_hWnd, rcVert, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
        m_vSplit.SetSplitterPos(rcVert.Width()/1.4f); // from left
        m_lPane.Create(m_vSplit.m_hWnd);        
        m_vSplit.SetSplitterPane(0, m_lPane);   
        //m_lPane.SetTitle(L"Left Pane");

        m_rPane.Create(m_vSplit.m_hWnd);    
        m_vSplit.SetSplitterPane(1, m_rPane);       
        m_rPane.SetTitle(L"Properties");
        m_propertyWnd.Create(m_rPane.m_hWnd);
        //m_vSplit.SetSplitterPane(SPLIT_PANE_LEFT, md.m_hWnd);

        return 0;
    }
    LRESULT OnDestroy( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled )
    { …
Run Code Online (Sandbox Code Playgroud)

c++ winapi wtl

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

CAppModule与CAtlExeModuleT,获取应用程序消息循环

我试图从我的项目中的ATL :: CAppModule获取消息循环,似乎没有,所以:

  • 我试着定义CAppModule,用extern CAppModule _Module;"stdafx.h"CAppModule _Module;我的.cpp文件,汇编,linkes并在执行注册步骤我得到断言atlbase.h这里 ATLASSERT(_pAtlModule == NULL); 这意味着CAppModule已声明.

但我似乎无法找到另一个CAppModule实例,而是看到CAtlExeModuleT实例化(它不是我的代码..).

现在..从我搜索过的内容中我找不到从CAtlExeModuleT对象获取消息循环的方法.他们是不同的东西还是我错过了什么?

c++ winapi wtl atl

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

我如何使用WTL :: CHyperLink?

我正在尝试使用WTL :: CHyperLink,以便在我的应用程序上显示可点击的链接.

根据这篇文章,我需要将它附加到静态文本控件.

因此,在我的GUI中,我现在创建了一个ID为IDC_LINK的静态文本控件

在我的DDX MAP中:

BEGIN_DDX_MAP(MyDialog)
    DDX_CONTROL_HANDLE(IDC_LINK, m_link)
END_DDX_MAP()
Run Code Online (Sandbox Code Playgroud)

并作为成员变量:

CHyperLink m_link;
Run Code Online (Sandbox Code Playgroud)

但是,我总是留下这个:

Error C2679: Binary Operator '=': No operator accepting a right-hand operant of type 'ATL::CWindow' (or no suitable conversion possible)
Run Code Online (Sandbox Code Playgroud)

有谁知道我做错了什么?

c++ mfc wtl atl

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

CWindowImpl - Create()返回错误代码1406

我只是尝试设置一个小的win32项目,并且即将创建一个窗口.

我在资源设计器中创建了一个对话框,并为我的窗口设置了这个类:

#pragma once
#include "stdafx.h"

class TTTMainDialog : public CWindowImpl<TTTMainDialog>
{
public:

    DECLARE_WND_CLASS(_T("TTTDlg"))

    enum { IDD = IDD_TTT_DIALOG };

    BEGIN_MSG_MAP_EX(MusicPlayerDialog)
        MSG_WM_INITDIALOG(OnInitDialog);
        MSG_WM_CLOSE(OnClose);
        MSG_WM_DESTROY(OnDestroy);
    END_MSG_MAP()

    TTTMainDialog();
    ~TTTMainDialog();

private:

    const BOOL OnInitDialog(const CWindow wndFocus, const LPARAM lInitParam);
    void OnClose();
    void OnDestroy();
};
Run Code Online (Sandbox Code Playgroud)

如你所见,我添加了窗口类声明,我继承了CWindowImpl,我注册了对话框.我不认为我在这里忘记了什么.

在应该创建对话框的类中,我试图像这样创建它:

TTTMainDialog myDialog;
HWND handle = myDialog.Create(NULL);
myDialog.ShowWindow(nCmdShow);
Run Code Online (Sandbox Code Playgroud)

但是,Create方法始终返回NULL.我用GetLastError()检查了错误代码,结果我得到错误代码1406或"ERROR_TLW_WITH_WSCHILD".

msdn文档说明了以下有关此错误的信息:

"无法创建顶级子窗口."

我试图谷歌这个,但没有太多要找.

如果我不得不猜测我会说问题是由一些窗口类名称细节引起的,但我真的不确定.

有什么建议?

c++ winapi wtl atl

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

将短(8.3)路径转换为长路径?

在 Win32/WTL/C++ 应用程序中,我需要将一些 8.3 路径转换为它们的真实文件名。我该怎么做?

谢谢,

winapi wtl

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

atlwin.h中的编译器错误

当从Visual Studio 2013构建中的Microsoft ATL库中包含atlwin.h时,将导致关于未定义元素的大量编译器错误.

#include <atlwin.h>
class MainWnd : public CWindowImpl<MainWnd>
{};
Run Code Online (Sandbox Code Playgroud)

"CWindowImpl:未定义基类"错误.

要么

HMONITOR没有定义

使用VS2010构建时不会发生这种情况.

我该如何解决这个问题?

c++ wtl atl

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

WM_SYSCOMMAND SC_MOVE会占用鼠标事件,并且不会触发鼠标

我的程序是一个无边框窗口,我想在用户拖动对话框的任何部分时移动窗口.使用WM_SYSCOMMAND后,所有后续鼠标事件都将丢失.

首先,我编写了一个程序来捕获鼠标事件,并且所有工作都可以正常使用WTL.

BEGIN_MSG_MAP(CMainDlg)
    MSG_WM_LBUTTONUP(OnMouseUp)
    MSG_WM_LBUTTONDOWN(OnMouseDown)
....
LRESULT OnMouseDown ( UINT uKeys, CPoint pt ) {
    print ("on mouse down");
    return 0;
}
LRESULT OnMouseUp ( UINT uKeys, CPoint pt ) {
    print ("on mouse up");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后我改变上面的onMouseDown,

LRESULT OnMouseDown ( UINT uKeys, CPoint pt ) {
    print ("on mouse down");
    this->SendMessageW(WM_SYSCOMMAND, SC_MOVE|0x0002);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

拖动工作正常,窗口随鼠标移动.但是,OnMouseUp事件不再被触发.

使用WM_NCHITTEST尝试了许多不同的方法,或者使用ProcessMessage将setHandled设置为true/false而没有成功.

非常感谢,如果有人有任何建议:)

c++ windows wtl atl

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

标签 统计

wtl ×12

c++ ×8

winapi ×8

atl ×7

mfc ×3

com ×1

visual-c++ ×1

windows ×1