我已经创建了我自己的自定义绘制列表与复选框WTL,我想让它现在可滚动,事情是,我正在子类化我绘制的静态文本控件..我不知道静态控件是否支持任何滚动方式..无论如何我的问题是如何使我的自定义控件可滚动,我是否必须自己强制机制?
我已经看到了人们DrawFrameControl
一起使用的情况PtInRect
(鼠标位置被测试到框架控件的矩形),以模拟控件(如按钮)的效果.你为什么要这样做,而不是使用子窗口?
使用此技术的示例是此对接框架,其中对接窗口的关闭按钮不是物理窗口.
对于我正在编写的应用程序,我使用的列表视图控件最多可容纳1000个项目.每个项目将保持,比方说,10个按钮.所有按钮都是自定义绘制的
它会被认为是一种更有效(和更快)的方法来使用这种PtInRect
机制吗?
在每个WTL示例中,CoInitialize
都被称为第一个函数WinMain
.我知道WTL基于ATL,它与COM密切相关,但正如我所看到的,WTL程序很容易不能使用任何COM代码(不是吗?).
更令人困惑的是CComCriticalSection
,尽管名称如此,ATL仍然有与COM无关的类.
所以我的问题是:是否有必要调用CoInitialize
WTL程序,即使没有明确使用COM?
我在使用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)
这就是它最终在屏幕上看起来的样子.控件本身比它中的文本大,但我不知道如何让其余的控件用黑色背景绘制.看起来将背景颜色设置为黑色只会影响文本显示的区域.关于我可能做错的任何想法?
我有一个Windows模板库CListViewCtrl在报告模式(所以有一个2列的标题)与所有者数据集.此控件显示搜索结果.如果没有返回结果,我想在列表框区域中显示一条消息,表明没有结果.是否有捷径可寻?你知道任何现有的控件/示例代码(我找不到任何东西).
否则,如果我将控件子类化以提供此功能,那么这将是一个好方法吗?
我正在开发窗口应用程序,因为我在左侧和右侧有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) 我试图从我的项目中的ATL :: CAppModule获取消息循环,似乎没有,所以:
extern CAppModule _Module;
在"stdafx.h"
和CAppModule _Module;
我的.cpp文件,汇编,linkes并在执行注册步骤我得到断言atlbase.h
这里
ATLASSERT(_pAtlModule == NULL);
这意味着CAppModule已声明.但我似乎无法找到另一个CAppModule实例,而是看到CAtlExeModuleT实例化(它不是我的代码..).
现在..从我搜索过的内容中我找不到从CAtlExeModuleT对象获取消息循环的方法.他们是不同的东西还是我错过了什么?
我正在尝试使用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)
有谁知道我做错了什么?
我只是尝试设置一个小的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文档说明了以下有关此错误的信息:
"无法创建顶级子窗口."
我试图谷歌这个,但没有太多要找.
如果我不得不猜测我会说问题是由一些窗口类名称细节引起的,但我真的不确定.
有什么建议?
在 Win32/WTL/C++ 应用程序中,我需要将一些 8.3 路径转换为它们的真实文件名。我该怎么做?
谢谢,
当从Visual Studio 2013构建中的Microsoft ATL库中包含atlwin.h时,将导致关于未定义元素的大量编译器错误.
即
#include <atlwin.h>
class MainWnd : public CWindowImpl<MainWnd>
{};
Run Code Online (Sandbox Code Playgroud)
"CWindowImpl:未定义基类"错误.
要么
HMONITOR没有定义
使用VS2010构建时不会发生这种情况.
我该如何解决这个问题?
我的程序是一个无边框窗口,我想在用户拖动对话框的任何部分时移动窗口.使用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而没有成功.
非常感谢,如果有人有任何建议:)