小编Alw*_*uff的帖子

在编辑控件中显示无效输入的工具提示

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

在此输入图像描述

到目前为止,我能够实现跟踪工具提示并在用户进行无效输入时显示它.

但是,工具提示是错误的.我试图使用ScreenToClientClientToScreen修复此问题但失败了.

以下是创建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)

c++ winapi tooltip editcontrol

11
推荐指数
2
解决办法
3040
查看次数

在我设置视觉样式后,常规控件未使用WM_CTLCOLORSTATIC处理程序正确绘制

介绍及相关资料:

我有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上,启动相同的程序后,我得到了这个:

在此输入图像描述

这里,组框 …

c++ winapi

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

限制平移量以防止图像从窗口徘徊

介绍:

我已导出SVGXAML,并且它变成了带有大量路径的Canvas.

在制作简单的自动生成窗口的Canvas主要内容之后,图像被剪裁,因为它比主窗口的客户端矩形更大.

我通过实现平移解决了这个问题.

由于我打算稍后进行缩放,我在Canvas中添加了虚拟ScaleTransform,XAML并将其RenderTransformOrigin更改为0.5 , 0.5(因此我可以围绕其中心缩放图像).

我想在加载窗口时将图像置于中心位置,所以我将Canvas放在Viewbox中,在调整了几个属性之后,它似乎工作得很好.

问题:

由于我已经更改了Canvas的RenderTransformOrigin,我无法弄清楚能够限制平移量的数学.

即使Viewbox是主窗口的内容,我也无法获得主窗口客户区的尺寸(Viewbox调整大小以适应其内容).这使我的任务更加困难.

我努力解决这个问题:

除了使用P/InvokeGetClientRectWinAPI调用之外,似乎没有其他方法可以获取主窗口的客户端矩形.

有另一个黑客查询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)

c# wpf xaml panning

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

正确组合StretchBlt和TransparentBlt,可以正确创建透明位图

介绍及相关资料:

最近,我在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)

c++ winapi

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

使用MoveWindow或SetWindowPos时,编辑控件/组合框的窗口大小未正确调整

介绍及相关资料:

我正在尝试使用可编辑的项目和子项实现listview控件.而不是常规列表视图外观,项目和子项目应具有编辑控件,复选框或组合框.

我正在使用原始WinAPIC++.我的目标是Windows XP向前发展.

我努力解决问题:

在这里和互联网上进行研究之后,我只能找到一些例子MFC.他们都使用LVN_BEGINLABELEDIT技术来实现这种行为.

不幸的是我完全不理解这个概念所以我决定从头开始(我认为这也是提高编程技能的最佳方法).

我的概念:

我决定赶上NM_DBLCLKlistview,并从那里使用ListView_GetItemRectListView_GetSubItemRect宏获取坐标.

然后我只需将组合框/复选框/编辑控件移动到相应的项目/子项目上(组合框/编辑控件/复选框将被创建为单独的隐藏窗口).

用户完成输入后(按输入或更改焦点)我只需隐藏组合框/复选框/编辑控件.

我目前的成绩:

目前,当项目/子项目上方移动时,我坚持使用组合框/编辑控件/复选框的尺寸与项目/子项目尺寸不同.

题:

可以改进下面提交的代码示例,以便将组合框/编辑控件/复选框窗口大小正确调整为项目/子项目的大小吗?目前,我只关注问题的这一部分,以尽可能缩短这个问题.

以下是创建说明问题的小应用程序的说明.请注意,我尽力保持尽可能少的事情:

1.)Win32 projectVisual 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)

c++ winapi listview editing subitem

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

当用户在其滚动条上拖动listview项时,执行默认滚动行为

介绍:

我不是母语为英语的人,我也不是很有经验的程序员.

我遇到了一个我很难描述的问题,所以在阅读这个问题时请记住这一点.

相关信息:

我正在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)

c++ winapi listview scroll drag

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

如何找到树形视图等于字符串变量的树视图节点?

首先,我要感谢所有花时间查看此主题并尝试提供帮助的人.

我在Internet上搜索过,找不到选择树视图节点的示例,该节点的标签文本与字符串变量的文本相同.

在MSDN上我找到了消息TVM_GETISEARCHSTRING但我不知道它是否可以用来解决我的问题.即使它可以,我仍然不知道如何使用它.

我有一个字符串变量,用于保存数据库中的文本.程序加载时,树视图应该有一个选择了相同文本的节点.

请帮忙处理一些说明或代码片段,因为我不知道如何开始编码.

我使用纯WIN32 API在Windows XP上使用纯WIN32 API在MS Visual Studio Express 2008中工作.

这就是全部,再次感谢所有试图帮助的人.非常感谢你们!

编辑:

这两个答案对我都有好处,但我不知道如何标记它们,似乎在这个网站上只有一个答案可以接受.

我不可能只是忽略了他们所投入的所有工作来帮助我,所以我写这个是为了试图回报Jonathan至少通过正式声明他的解决方案对我来说也是可以接受的,这只是Tim的解决方案更适合我的编码风格.我也会提出两个答案.

c++ winapi

6
推荐指数
2
解决办法
3190
查看次数

双缓冲故障(2013年12月17日更新)

介绍及相关资料:

我有一个复杂的绘画要在我的主窗口的WM_PAINT处理程序中实现.

我已经提交了一张图片来说明它:

在此输入图像描述

主窗口具有静态控件,而不是具有样式的按钮SS_NOTIFY.

当用户点击它们时,程序中会发生某些操作,这与现在无关.

下图显示了主窗口中静态控件的位置:

在此输入图像描述

橙色面板上的地图是EMF文件,左上角和右上角的徽标是PNG文件,其他图片是bitmaps.

Visual Styles通过#pragma指令启用.我也GDI+一起使用GDI.

项目是作为空项目创建的,我已经从"临时"编写了所有内容.

为了实现这个任务,我决定将整个画面画出来WM_PAINT,并将透明static control放在与它们对应的图像上.

为了保持我的代码干净简单,我已经制作了实现上述功能的函数,因此我的WM_PAINT处理程序可以尽可能小.

更新#1(2013年12月17日更新):

为了实现从成员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)

c++ winapi flicker double-buffering

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

调整窗口大小时,常用控件未正确绘制

介绍:

我正在创建带有子对话框作为页面的选项卡控件.

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)

c++ winapi tabs visual-styles common-controls

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

使用LVM_SORTITEMSEX将所有选定项目移动到特定项目下方

介绍:

为了使这篇文章尽可能简短,我只想说我需要将列表视图中的所有选定项目移动到某个(未选中)项目下方.

浏览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)

c c++ winapi listview

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