[Win32SDK基本]Static Control(2)Image Static Control

本文是Win32SDK系列的第二篇,主要介绍如何使用Static Control显示位图或图标,包括SS_BITMAP、SS_ICON等样式,并讲解了STM_SETIMAGE等消息的使用。还提到了在版本6的Win32控件中,设置位图后需手动释放资源的重要性,以及从其他开发者经验中学习到的知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文由优快云用户zuishikonghuan所作,转载请注明出处: http://blog.youkuaiyun.com/zuishikonghuan/article/details/46620965

上一篇博文([Win32SDK基本]Static Control(1)Text Static Control 和 WM_CTLCOLORSTATIC,地址:http://blog.youkuaiyun.com/zuishikonghuan/article/details/46604945)中,介绍了Text Static Control的使用以及利用 WM_CTLCOLORSTATIC 消息修改其前景色和背景色,这篇将介绍 Image Static Control,他可以显示位图或图标

创建子窗口和 Static Control 相关的风格已经在上一篇中详细说了,因此这一篇中不再重复了。但把用到的几个样式再拿出来说一下:

SS_BITMAP:显示一个位图

SS_ICON:显示一个图标(MSDN: If the control is created via CreateWindow or a related function, the text is the name of an icon (not a filename) defined in

有关调用实时(JIT)调试而不是此对话框的详细信息, 请参见此消息的结尾。 ************** 异常文本 ************** System.InvalidOperationException: DragDrop 注册失败。 ---> System.Threading.ThreadStateException: 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 在 System.Windows.Forms.Control.SetAcceptDrops(Boolean accept) --- 内部异常堆栈跟踪的结尾 --- 在 System.Windows.Forms.Control.SetAcceptDrops(Boolean accept) 在 System.Windows.Forms.Control.OnHandleCreated(EventArgs e) 在 System.Windows.Forms.TreeView.OnHandleCreated(EventArgs e) 在 System.Windows.Forms.Control.WmCreate(Message& m) 在 System.Windows.Forms.Control.WndProc(Message& m) 在 System.Windows.Forms.TreeView.WndProc(Message& m) 在 Cognex.VisionPro.Implementation.Internal.CogTreeViewBase.CogPaintedTreeView.DefaultWndProc(Message& m) 在 Cognex.VisionPro.Implementation.Internal.CogTreeViewBase.TreeView_WndProcRunning(Object sender, Message& msg, Boolean& cancel) 在 Cognex.VisionPro.Implementation.Internal.CogTreeViewBase.CogPaintedTreeView.OnWndProcRunning(Message& msg, Boolean& cancel) 在 Cognex.VisionPro.Implementation.Internal.CogTreeViewBase.CogPaintedTreeView.WndProc(Message& m) 在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) ************** 已加载的程序集 ************** mscorlib 程序集版本:4.0.0.0 Win32 版本:4.8.9195.0 built by: NET481REL1LAST_B 基本代码:file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/mscorlib.dll ---------------------------------------- Vision-撕胶带 程序集版本:1.0.0.0 Win32 版本:1.0.0.0 基本代码:file:///D:/soft/Debug/Vision-%E6%92%95%E8%83%B6%E5%B8%A6.exe ---------------------------------------- System.Windows.Forms 程序集版本:4.0.0.0 Win32 版本:4.8.9195.0 built by: NET481REL1LAST_B 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll ---------------------------------------- System 程序集版本:4.0.0.0 Win32 版本:4.8.9195.0 built by: NET481REL1LAST_B 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll ---------------------------------------- System.Drawing 程序集版本:4.0.0.0 Win32 版本:4.8.9037.0 built by: NET481REL1 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll ---------------------------------------- System.Configuration 程序集版本:4.0.0.0 Win32 版本:4.8.9037.0 built by: NET481REL1 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll ---------------------------------------- System.Core 程序集版本:4.0.0.0 Win32 版本:4.8.9195.0 built by: NET481REL1LAST_B 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll ---------------------------------------- System.Xml 程序集版本:4.0.0.0 Win32 版本:4.8.9037.0 built by: NET481REL1 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll ---------------------------------------- Cognex.VisionPro.Controls 程序集版本:53.2.0.0 Win32 版本:53.2.0.0 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_64/Cognex.VisionPro.Controls/v4.0_53.2.0.0__ef0f902af9dee505/Cognex.VisionPro.Controls.dll ---------------------------------------- Cognex.VisionPro.Display.Controls 程序集版本:53.2.0.0 Win32 版本:53.2.0.0 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_64/Cognex.VisionPro.Display.Controls/v4.0_53.2.0.0__ef0f902af9dee505/Cognex.VisionPro.Display.Controls.dll ---------------------------------------- Cognex.VisionPro.Core 程序集版本:53.2.0.0 Win32 版本: 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_64/Cognex.VisionPro.Core/v4.0_53.2.0.0__ef0f902af9dee505/Cognex.VisionPro.Core.dll ---------------------------------------- mscorlib.resources 程序集版本:4.0.0.0 Win32 版本:4.8.4084.0 built by: NET48REL1 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_zh-Hans_b77a5c561934e089/mscorlib.resources.dll ---------------------------------------- System.Windows.Forms.resources 程序集版本:4.0.0.0 Win32 版本:4.8.4084.0 built by: NET48REL1 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_zh-Hans_b77a5c561934e089/System.Windows.Forms.resources.dll ---------------------------------------- Cognex.VisionPro 程序集版本:53.2.0.0 Win32 版本:53.2.0.0 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_64/Cognex.VisionPro/v4.0_53.2.0.0__ef0f902af9dee505/Cognex.VisionPro.dll ---------------------------------------- Cognex.VisionPro.Interop.Core 程序集版本:53.2.0.0 Win32 版本: 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Cognex.VisionPro.Interop.Core/v4.0_53.2.0.0__ef0f902af9dee505/Cognex.VisionPro.Interop.Core.dll ---------------------------------------- Cognex.VisionPro.Display.Controls.resources 程序集版本:53.2.0.0 Win32 版本:53.2.0.0 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Cognex.VisionPro.Display.Controls.resources/v4.0_53.2.0.0_zh-Hans_ef0f902af9dee505/Cognex.VisionPro.Display.Controls.resources.dll ---------------------------------------- Cognex.VisionPro.Interop.DisplayCtl 程序集版本:53.2.0.0 Win32 版本:53.2.0.0 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Cognex.VisionPro.Interop.DisplayCtl/v4.0_53.2.0.0__ef0f902af9dee505/Cognex.VisionPro.Interop.DisplayCtl.dll ---------------------------------------- Serilog 程序集版本:2.0.0.0 Win32 版本:2.12.0.0 基本代码:file:///D:/soft/Debug/Serilog.DLL ---------------------------------------- Serilog.Sinks.Console 程序集版本:4.0.1.0 Win32 版本:4.0.1.0 基本代码:file:///D:/soft/Debug/Serilog.Sinks.Console.DLL ---------------------------------------- Serilog.Sinks.File 程序集版本:5.0.0.0 Win32 版本:5.0.0.0 基本代码:file:///D:/soft/Debug/Serilog.Sinks.File.DLL ---------------------------------------- MvCamCtrl.Net 程序集版本:0.0.0.0 Win32 版本:0.0.0.0 基本代码:file:///D:/soft/Debug/MvCamCtrl.Net.DLL ---------------------------------------- Cognex.VisionPro.ToolGroup 程序集版本:53.2.0.0 Win32 版本:53.2.0.0 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_64/Cognex.VisionPro.ToolGroup/v4.0_53.2.0.0__ef0f902af9dee505/Cognex.VisionPro.ToolGroup.dll ---------------------------------------- System.Runtime.Serialization.Formatters.Soap 程序集版本:4.0.0.0 Win32 版本:4.8.9037.0 built by: NET481REL1 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Runtime.Serialization.Formatters.Soap/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll ---------------------------------------- Cognex.VisionPro.PMAlign 程序集版本:53.2.0.0 Win32 版本: 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_64/Cognex.VisionPro.PMAlign/v4.0_53.2.0.0__ef0f902af9dee505/Cognex.VisionPro.PMAlign.dll ---------------------------------------- Cognex.VisionPro.CalibFix 程序集版本:53.2.0.0 Win32 版本: 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_64/Cognex.VisionPro.CalibFix/v4.0_53.2.0.0__ef0f902af9dee505/Cognex.VisionPro.CalibFix.dll ---------------------------------------- Cognex.VisionPro.Blob 程序集版本:53.2.0.0 Win32 版本: 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_64/Cognex.VisionPro.Blob/v4.0_53.2.0.0__ef0f902af9dee505/Cognex.VisionPro.Blob.dll ---------------------------------------- Cognex.VisionPro.QuickBuild.Core 程序集版本:53.2.0.0 Win32 版本:53.2.0.0 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_64/Cognex.VisionPro.QuickBuild.Core/v4.0_53.2.0.0__ef0f902af9dee505/Cognex.VisionPro.QuickBuild.Core.dll ---------------------------------------- cowsi2ha 程序集版本:0.0.0.0 Win32 版本:4.8.9195.0 built by: NET481REL1LAST_B 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll ---------------------------------------- System.resources 程序集版本:4.0.0.0 Win32 版本:4.8.4084.0 built by: NET48REL1 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.resources/v4.0_4.0.0.0_zh-Hans_b77a5c561934e089/System.resources.dll ---------------------------------------- Accessibility 程序集版本:4.0.0.0 Win32 版本:4.8.9037.0 built by: NET481REL1 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Accessibility/v4.0_4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll ---------------------------------------- Cognex.VisionPro.resources 程序集版本:53.2.0.0 Win32 版本:53.2.0.0 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Cognex.VisionPro.resources/v4.0_53.2.0.0_zh-Hans_ef0f902af9dee505/Cognex.VisionPro.resources.dll ---------------------------------------- Cognex.VisionPro.CorePlus 程序集版本:53.2.0.0 Win32 版本: 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_64/Cognex.VisionPro.CorePlus/v4.0_53.2.0.0__ef0f902af9dee505/Cognex.VisionPro.CorePlus.dll ---------------------------------------- Cognex.VisionPro.ImageFile 程序集版本:53.2.0.0 Win32 版本: 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_64/Cognex.VisionPro.ImageFile/v4.0_53.2.0.0__ef0f902af9dee505/Cognex.VisionPro.ImageFile.dll ---------------------------------------- Cognex.VisionPro.ToolGroup.Controls 程序集版本:53.2.0.0 Win32 版本:53.2.0.0 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_64/Cognex.VisionPro.ToolGroup.Controls/v4.0_53.2.0.0__ef0f902af9dee505/Cognex.VisionPro.ToolGroup.Controls.dll ---------------------------------------- Cognex.VisionPro.Controls.resources 程序集版本:53.2.0.0 Win32 版本:53.2.0.0 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Cognex.VisionPro.Controls.resources/v4.0_53.2.0.0_zh-Hans_ef0f902af9dee505/Cognex.VisionPro.Controls.resources.dll ---------------------------------------- Cognex.VisionPro.ToolGroup.Controls.resources 程序集版本:53.2.0.0 Win32 版本:53.2.0.0 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Cognex.VisionPro.ToolGroup.Controls.resources/v4.0_53.2.0.0_zh-Hans_ef0f902af9dee505/Cognex.VisionPro.ToolGroup.Controls.resources.dll ---------------------------------------- Microsoft.GeneratedCode 程序集版本:1.0.0.0 Win32 版本:4.8.9037.0 built by: NET481REL1 基本代码:file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll ---------------------------------------- ************** JIT 调试 ************** 要启用实时(JIT)调试, 该应用程序或计算机的 .config 文件(machine.config)的 system.windows.forms 节中必须设置 jitDebugging 值。 编译应用程序时还必须启用 调试。 例如: <configuration> <system.windows.forms jitDebugging="true" /> </configuration> 启用 JIT 调试后,任何未经处理的异常 都将被发送到在此计算机上注册的 JIT 调试程序, 而不是由此对话框处理。
最新发布
05-29
<think>好的,我现在需要帮助用户解决在使用Cognex.VisionPro和TreeView控件时遇到的System.InvalidOperationException和ThreadStateException异常,特别是关于STA模式设置的问题。首先,我得回忆一下STA线程模型的相关知识。STA(Single-Threaded Apartment)是COM组件使用的线程模型,许多旧的组件,包括一些图形用户界面相关的控件,都需要在STA线程中运行,否则会引发异常。用户提到的DragDrop注册失败和ThreadStateException,通常是因为主线程没有标记为STAThreadAttribute。在C#中,程序的入口点(Main方法)需要加上[STAThread]属性,以确保线程以STA模式运行。如果没有这个属性,当调用某些需要STA的COM组件时,就会抛出异常。接下来,我需要检查用户可能的代码结构。用户的程序可能是一个WindowsForms或WPF应用,使用了TreeView控件,并且在进行拖放操作时出现问题。TreeView的拖放功能可能依赖于STA模式,尤其是在与VisionPro的组件交互时。VisionPro的某些功能可能也依赖于COM,因此必须确保线程模型正确。然后,解决方案的第一步应该是确保主线程标记为STAThread。这需要检查Program.cs或Main方法是否有[STAThread]属性。如果没有,添加这个属性应该能解决问题。例如:```csharp[STAThread] staticvoid Main() {Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new MainForm());} ```如果用户使用的是WPF,入口点可能不同,但同样需要设置STAThread。不过WPF默认使用STA,所以可能问题出在WinForms应用中。 另外,用户可能在多线程环境下操作UI控件,比如在非UI线程中访问TreeView或VisionPro的组件,导致跨线程问题。这时候需要使用Invoke或BeginInvoke来确保操作在正确的线程上执行。例如:```csharptreeView1.Invoke((MethodInvoker)delegate{//操作TreeView的代码}); ```此外,VisionPro的图像采集和处理可能需要特定的线程设置。如果用户在非STA线程中初始化VisionPro组件,也可能导致异常。需要确保所有与VisionPro相关的操作都在STA线程中进行,可能需要显式创建STA线程并处理消息泵。 还有,用户的TreeView控件如果启用了拖放功能(如DragDrop),必须确保拖放操作在STA线程中处理。检查DragDrop相关的事件处理程序,确保它们没有在后台线程中被触发。最后,用户的项目平台设置是否正确?之前引用中提到,将目标平台从x86改为x64解决了某些异常。虽然这与线程问题无关,但可能影响组件的兼容性,特别是64位系统下使用32位组件可能导致问题。需要确认VisionPro的SDK版本是否与项目平台匹配,比如使用x64目标平台可能需要64位的SDK支持。 总结可能的解决步骤:添加STAThread属性,检查线程模型,确保UI操作在正确线程,处理VisionPro组件的线程关联,以及验证项目平台设置。同时,参考用户之前的经验,将目标平台改为x64可能有助于解决其他兼容性问题,但当前问题更可能直接与STA设置相关。</think>在Cognex.VisionPro开发中解决STA模式问题需遵循以下步骤: ### 一、核心问题定位 `System.InvalidOperationException`和`ThreadStateException`通常源于Windows窗体的线程公寓模式(STA)配置错误。VisionPro的COM组件和TreeView拖拽功能均依赖STA线程模型,未正确设置时会导致: - 无法注册DragDrop事件 - 跨线程访问UI控件异常 - 硬件交互失败 ### 二、解决方案实施 #### 1. 主线程标记STA属性 在Program.cs入口点添加`[STAThread]`: ```csharp [STAThread] // 关键属性声明 static void Main() { ApplicationConfiguration.Initialize(); Application.Run(new MainForm()); } ``` #### 2. 显式创建STA工作线程 对于VisionPro硬件交互操作: ```csharp var visionThread = new Thread(() => { Cognex.VisionPro.CogFrameGrabers frameGrabers = new Cognex.VisionPro.CogFrameGrabers(); // 硬件操作代码 }); visionThread.SetApartmentState(ApartmentState.STA); // 显式设置线程模型 visionThread.Start(); ``` #### 3. TreeView拖拽事件处理 在窗体构造函数中初始化拖拽上下文: ```csharp public MainForm() { InitializeComponent(); treeView1.AllowDrop = true; treeView1.ItemDrag += (s, e) => { DoDragDrop(e.Item, DragDropEffects.Move); }; } ``` #### 4. 跨线程安全访问 通过`Invoke`方法同步UI操作: ```csharp void UpdateTreeViewNode(string msg) { if (treeView1.InvokeRequired) { treeView1.Invoke(new Action(() => UpdateTreeViewNode(msg))); return; } // 直接操作TreeView } ``` ### 三、配置验证清单 | 检查项 | 标准值 | 验证方法 | |-------------------------|--------------|------------------------------| | 项目目标平台 | x64 | 项目属性 → 生成 → 平台目标 | | 主线程公寓模式 | STA | Main方法标记[STAThread] | | VisionPro SDK版本 | 9.2+ | 控制面板 → 已安装程序 | | 线程同步机制 | 使用Invoke | 代码审查跨线程操作 | ### 四、深度优化建议 1. **VisionPro组件封装**:将硬件操作封装到继承自`Component`的类中,自动继承STA特性 2. **异步模式改造**: ```csharp async Task SafeDragDropAsync(object data) { await treeView1.SafeInvokeAsync(() => { DoDragDrop(data, DragDropEffects.Move); }); } ``` 3. **诊断工具**:使用`Cognex.VisionPro.Diagnostics.CogPerformanceMonitor`检测线程冲突 ### 五、典型异常处理模式 ```csharp try { cogJobManager.JobEnable(0, true); } catch (ThreadStateException ex) { Log($"线程状态异常:{ex.Message}"); ReinitializeVisionProRuntime(); // 重新初始化运行时环境 } catch (InvalidOperationException ex) { Log($"非法操作:{ex.Message}"); VerifySTAConfiguration(); // 验证线程配置 } ``` ### 六、引用配置验证 根据引用[^1]的经验,当切换为x64平台时: $$ \text{兼容性指数} = \frac{\text{SDK位数}}{\text{目标平台位数}} \times 100\% $$ 建议保持分子分母一致,即64位SDK对应x64平台目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值