我有子类编辑控件只接受浮动数字.我想在用户输入无效时弹出工具提示.我的目标行为就像一个带有的编辑控件ES_NUMBER:

到目前为止,我能够实现跟踪工具提示并在用户进行无效输入时显示它.
但是,工具提示是错误的.我试图使用ScreenToClient并ClientToScreen修复此问题但失败了.
以下是创建SCCE的说明:
1)在Visual Studio中创建默认的Win32项目.
2)在您的stdafx.h下方添加以下内容#include <windows.h>:
#include <windowsx.h>
#include <commctrl.h>
#pragma comment( lib, "comctl32.lib")
#pragma comment(linker, \
"\"/manifestdependency:type='Win32' "\
"name='Microsoft.Windows.Common-Controls' "\
"version='6.0.0.0' "\
"processorArchitecture='*' "\
"publicKeyToken='6595b64144ccf1df' "\
"language='*'\"")
Run Code Online (Sandbox Code Playgroud)
3)添加这些全局变量:
HWND g_hwndTT;
TOOLINFO g_ti;
Run Code Online (Sandbox Code Playgroud)
4)这是编辑控件的简单子类过程(仅用于测试目的):
LRESULT CALLBACK EditSubProc ( HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam,
UINT_PTR uIdSubclass, DWORD_PTR dwRefData )
{
switch (message)
{
case WM_CHAR:
{
POINT pt;
if( ! isdigit( wParam ) ) …Run Code Online (Sandbox Code Playgroud) 我有2个通过资源编辑器创建的对话框.由于我使用的是Microsoft Visual Studio Express版本,因此我必须下载免费的资源编辑器来创建它们.在我的程序中,我启用了这样的:Visual Styles
#include <commctrl.h>
#pragma comment( lib, "comctl32.lib")
#pragma comment( linker, "/manifestdependency:\"type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' \
language='*'\"")
Run Code Online (Sandbox Code Playgroud)
据我所知,复选框,单选按钮和组框获取WM_CTLCOLORSTATIC消息,用于绘制文本.
这是我为第一个和第二个对话框编写的代码:
case WM_CTLCOLORSTATIC:
{
SetBkMode( (HDC)wParam, TRANSPARENT );
SetTextColor( (HDC)wParam, RGB( 0, 0, 0 ) );
return (INT_PTR)( (HBRUSH)GetStockObject(NULL_BRUSH) );
}
Run Code Online (Sandbox Code Playgroud)
我希望这些控件具有透明文本背景和文本的黑色.
在Windows XP上,这是第一个对话框的结果图像:

组框有蓝色文字和棕色边框,而复选框有一切黑色.在Windows 7上,启动相同的程序后,我得到了这个:

这里,组框 …
我已导出SVG为XAML,并且它变成了带有大量路径的Canvas.
在制作简单的自动生成窗口的Canvas主要内容之后,图像被剪裁,因为它比主窗口的客户端矩形更大.
我通过实现平移解决了这个问题.
由于我打算稍后进行缩放,我在Canvas中添加了虚拟ScaleTransform,XAML并将其RenderTransformOrigin更改为0.5 , 0.5(因此我可以围绕其中心缩放图像).
我想在加载窗口时将图像置于中心位置,所以我将Canvas放在Viewbox中,在调整了几个属性之后,它似乎工作得很好.
由于我已经更改了Canvas的RenderTransformOrigin,我无法弄清楚能够限制平移量的数学.
即使Viewbox是主窗口的内容,我也无法获得主窗口客户区的尺寸(Viewbox调整大小以适应其内容).这使我的任务更加困难.
除了使用P/Invoke和GetClientRectWinAPI调用之外,似乎没有其他方法可以获取主窗口的客户端矩形.
有另一个黑客查询SystemParametersInfo用于非客户指标,如边框和标题栏,但这是一个估计可能因应用主题和类似原因而失败.
我没试过用 P/Invoke因为我现在只是拒绝这样做.必须有比这更好的解决方案!那条道路应该是我的最后选择,也是我绝望的选择.
我试图找到自己的替代方法,但失败了.
我试图TransformToAncestor(...).Transformtobounds(..)用于我的计算,但也失败了.
如何限制平移,这样当用户拖得太多时,图像不会从主窗口消失?
我会接受替代解决方案.提交的代码是一个没有经验,自学成才的初学者的尝试,所以我接受建设性的批评和建议.
为了使这篇文章尽可能短,我只给出了相关的XAML和"代码隐藏"代码片段.
完整代码粘贴在Pastebin上,可以在本文的最底部找到.
相关的XAML片段:
<Window x:Class="TestZaMapu.MainWindow"
Name="GlavniProzor"
WindowStartupLocation="CenterScreen"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Height="350"
Width="525"
MouseLeftButtonDown="GlavniProzor_MouseLeftButtonDown"
MouseLeftButtonUp="GlavniProzor_MouseLeftButtonUp"
MouseMove="GlavniProzor_MouseMove"
LostMouseCapture="GlavniProzor_LostMouseCapture">
<Viewbox
Name="surface"
Stretch="UniformToFill"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Background="Blue"
x:Name="svg4306"
Width="494.44705"
Height="510.55356"
<!-- needed in the future, for zooming around center-->
RenderTransformOrigin="0.5, 0.5">
<!--Unknown …Run Code Online (Sandbox Code Playgroud) 最近,我在SO中问过一个关于正确缩放位图的问题,所以它可以保持图片的质量:
我试图在评论中使用一个建议,使用`StretchBlt,所以我做了一个小的演示程序.
在我将拉伸模式设置为之后,它确实改善了位图的清晰度BLACKONWHITE.
我想尝试制作位图的一部分,使用某种颜色 - 比如说黑色是透明的.
我之前使用过TransparentBlt,但我现在不知道怎么做.
为了保持图像的清晰度,我需要StretchBlt在存储器DC中使用拉伸模式BLACKONWHITE.
问题是我不知道如何Blt透明地进入主窗口的DC.
以下是演示应用的代码段:
case WM_PAINT:
{
// main window's DC
hdc = BeginPaint(hWnd, &ps);
// main window's client rectangle
RECT r;
GetClientRect( hWnd, &r );
// memory DC for double buffering
HDC MemDC = CreateCompatibleDC( hdc );
// fill it with test brush
FillRect( MemDC, &r, (HBRUSH)GetStockObject( GRAY_BRUSH ) );
// select loaded bitmap into memory DC
HBITMAP old = (HBITMAP)SelectObject( …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用可编辑的项目和子项实现listview控件.而不是常规列表视图外观,项目和子项目应具有编辑控件,复选框或组合框.
我正在使用原始WinAPI和C++.我的目标是Windows XP向前发展.
在这里和互联网上进行研究之后,我只能找到一些例子MFC.他们都使用LVN_BEGINLABELEDIT技术来实现这种行为.
不幸的是我完全不理解这个概念所以我决定从头开始(我认为这也是提高编程技能的最佳方法).
我的概念:
我决定赶上NM_DBLCLKlistview,并从那里使用ListView_GetItemRect或ListView_GetSubItemRect宏获取坐标.
然后我只需将组合框/复选框/编辑控件移动到相应的项目/子项目上(组合框/编辑控件/复选框将被创建为单独的隐藏窗口).
用户完成输入后(按输入或更改焦点)我只需隐藏组合框/复选框/编辑控件.
我目前的成绩:
目前,当项目/子项目上方移动时,我坚持使用组合框/编辑控件/复选框的尺寸与项目/子项目尺寸不同.
可以改进下面提交的代码示例,以便将组合框/编辑控件/复选框窗口大小正确调整为项目/子项目的大小吗?目前,我只关注问题的这一部分,以尽可能缩短这个问题.
以下是创建说明问题的小应用程序的说明.请注意,我尽力保持尽可能少的事情:
1.)Win32 project在Visual Studio(我使用VS 2008)中创建默认值.
2.)将以下WM_CREATE处理程序添加到主窗口的过程:
case WM_CREATE:
{
HWND hEdit = CreateWindowEx( 0,WC_EDIT, L"",
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_CENTER | ES_AUTOHSCROLL,
250, 10, 100, 20, hWnd, (HMENU)1500, hInst, 0 );
HWND hComboBox = CreateWindowEx( 0,WC_COMBOBOX, L"",
WS_CHILD …Run Code Online (Sandbox Code Playgroud) 我不是母语为英语的人,我也不是很有经验的程序员.
我遇到了一个我很难描述的问题,所以在阅读这个问题时请记住这一点.
我正在listview中实现拖放功能.我只是想能够重新排列listview中的行,没有拖动项目到其他窗口.
我不想使用OLE来执行此操作,并且我对在许多链接上找到的"默认"实现不满意.
我对如何做到这一点有自己的想法,但是我的经验不足使我无法实现自己的想法.
我正在使用Visual Studio,C++和原始WinAPI进行开发.我没有使用任何库,也不想现在开始使用它们.
我希望实现以下行为:
用户按下鼠标左键并开始拖动项目 - >用户将鼠标移动到垂直滚动条上 - >进行默认滚动.
由于滚动条计为非客户区,这意味着我必须以某种方式执行默认行为WM_NCMOUSEMOVE,WM_NCLBUTTONDOWN但我不知道该怎么做.
让我试着更好地解释一下我的意思:
当您拖动项目时,应用程序指示当鼠标位于项目上时(在列表视图的客户区域中)将丢弃的位置是合乎逻辑的.
当您将项目拖动到滚动条上时,很明显用户无法将项目拖放到那里.而不是指示无效的丢弃点(通过更改光标,例如像OLE一样),我希望执行以下操作:
我希望执行默认滚动条行为(就好像用户根本不拖动项目).用户将鼠标悬停在滚动条上,按下并按住鼠标左键,并可选择向上或向下移动鼠标.
当用户将鼠标从滚动条移回列表视图的客户区域时,继续拖放.
SSCCE
我的英语不够好,不能进行适当的研究(就像我在发布之前通常做的那样),而且我不知道任何有这种行为的应用程序,所以我很难在我的网站上解决这个问题.拥有.
尽管如此,我还是通过Raymond Chen的博客跋涉了一个想法.
下面的示例代码完美地展示了我上面谈到的行为.它并不完美,但它最接近实现我想要的行为.
创建空的C++项目,只需复制/粘贴下面的代码.
然后尝试将项目拖动到滚动条上.
重要提示:我没有实现重新排列项目,也没有更改光标形状以保持代码最小化.此SSCCE的目的是证明我想要的行为.
#include <windows.h>
#include <windowsx.h> // various listview macros etc
#include <CommCtrl.h>
#include <stdio.h> // swprintf_s()
// enable Visual Styles
#pragma comment( linker, "/manifestdependency:\"type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' \
language='*'\"")
// link with Common Controls library
#pragma comment( lib, "comctl32.lib")
//global variables
HINSTANCE hInst;
BOOL …Run Code Online (Sandbox Code Playgroud) 首先,我要感谢所有花时间查看此主题并尝试提供帮助的人.
我在Internet上搜索过,找不到选择树视图节点的示例,该节点的标签文本与字符串变量的文本相同.
在MSDN上我找到了消息TVM_GETISEARCHSTRING但我不知道它是否可以用来解决我的问题.即使它可以,我仍然不知道如何使用它.
我有一个字符串变量,用于保存数据库中的文本.程序加载时,树视图应该有一个选择了相同文本的节点.
请帮忙处理一些说明或代码片段,因为我不知道如何开始编码.
我使用纯WIN32 API在Windows XP上使用纯WIN32 API在MS Visual Studio Express 2008中工作.
这就是全部,再次感谢所有试图帮助的人.非常感谢你们!
这两个答案对我都有好处,但我不知道如何标记它们,似乎在这个网站上只有一个答案可以接受.
我不可能只是忽略了他们所投入的所有工作来帮助我,所以我写这个是为了试图回报Jonathan至少通过正式声明他的解决方案对我来说也是可以接受的,这只是Tim的解决方案更适合我的编码风格.我也会提出两个答案.
我有一个复杂的绘画要在我的主窗口的WM_PAINT处理程序中实现.
我已经提交了一张图片来说明它:

主窗口具有静态控件,而不是具有样式的按钮SS_NOTIFY.
当用户点击它们时,程序中会发生某些操作,这与现在无关.
下图显示了主窗口中静态控件的位置:

橙色面板上的地图是EMF文件,左上角和右上角的徽标是PNG文件,其他图片是bitmaps.
Visual Styles通过#pragma指令启用.我也GDI+一起使用GDI.
项目是作为空项目创建的,我已经从"临时"编写了所有内容.
为了实现这个任务,我决定将整个画面画出来WM_PAINT,并将透明static control图放在与它们对应的图像上.
为了保持我的代码干净简单,我已经制作了实现上述功能的函数,因此我的WM_PAINT处理程序可以尽可能小.
为了实现从成员arx获得的建议,我发布了一个可以编译的单一源代码,可以重现问题:
#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <gdiplus.h>
#pragma comment( linker, "/manifestdependency:\"type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' \
language='*'\"" )
#pragma comment( lib, "comctl32.lib")
#pragma comment( lib, "Msimg32.lib" )
#pragma comment( lib, "Gdiplus.lib" )
using namespace …Run Code Online (Sandbox Code Playgroud) 我正在创建带有子对话框作为页面的选项卡控件.
我Visual Styles通过#pragma评论启用了.我也呼吁InitCommonControlsEx,并#pragma comment( lib, "comctl32.lib" )为好.
最初,当窗口加载,对话框及其常用控件具有适当的背景时,请参见下图:
在调整大小期间,事情并不那么一致 - >背景开始明显不匹配.我将在下面提供截图:

你可以清楚地看到checkbox并且static control有不正确的背景,而在我看来dialog box(创建充当儿童控制)具有适当的背景.
2014年11月24日编辑:
封闭控件后group boxes,似乎没有绘画问题.我的显示器是旧的CRT(三星SyncMaster 753s),我的视力不好,但同样,似乎一切都画得很好.窗口仍然在调整大小时可怕地闪烁,但我已经尝试了一切能力来修复它.
我怎样才能解决这个问题?
我还没有找到任何东西,但我在输入这个问题时仍然是Goggling ...
以下是创建说明问题的演示的说明:
1.)创建空C++项目Visual Studio;
2.)添加头文件,命名pomocne_funkcije.h并复制/粘贴以下内容:
#include <windows.h>
#include <windowsx.h>
#include <comutil.h>
#include <commctrl.h>
#include <stdio.h>
#include <vector>
#include <ole2.h>
#include <string>
#include <stdlib.h>
#include <locale.h>
#include <Uxtheme.h>
#pragma comment( linker, "/manifestdependency:\"type='win32' \ …Run Code Online (Sandbox Code Playgroud) 为了使这篇文章尽可能简短,我只想说我需要将列表视图中的所有选定项目移动到某个(未选中)项目下方.
浏览listview文档,我发现了LVM_SORTITEMSEX消息.
如何使用上面的消息来实现我的目标.
到目前为止,通过使用此消息,我能够将所有选定的项目移动到列表的底部 - > listview的排序方式使得未选择的项目位于选定的项目之前.
我只是无法弄清楚如何实现在特定项目下移动所选项目.
下面是我得到的图像,以及我想要实现的目标:

左图显示了我使用下面提交的代码时得到的结果,而右图显示了我的目标结果.
以下是相关的代码段:
// compare function -> see the documentation
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM hwnd)
{
LVITEM lvi1 = { 0 }, lvi2 = { 0 };
// get selected state of the first item
lvi1.iItem = (int)lParam1;
lvi1.iSubItem = 0;
lvi1.mask = LVIF_STATE;
lvi1.stateMask = LVIS_SELECTED;
ListView_GetItem((HWND)hwnd, &lvi1);
// get selected state of the second item
lvi2.iItem = (int)lParam2;
lvi2.iSubItem = 0; …Run Code Online (Sandbox Code Playgroud)