我在使用GDI和GDI +交替绘图时遇到了问题.页面转换 - 特别是缩放 - 似乎在两者之间略微偏离.除了SetViewportExt和之外,GDI上下文的哪些属性会影响输出的缩放SetWindowExt?
该代码几乎只使用GDI进行绘图,但在少数需要其特征(半透明)的情况下使用GDI +.它使用SetViewportExt,SetWindowExt并SetViewportOrg启用缩放和滚动.
当需要GDI +时,我Gdiplus::Graphics在HDC周围构建一个对象并进行绘制.我假设这使图形上下文包装设备上下文并将其呈现中继到设备上下文.如果我提取GDI +图形上下文的变换矩阵,我看到它是单位矩阵,因此缩放是在别处完成的(在设备上下文中我猜).
我设计了一个简单的测试,我用GDI和GDI +绘制相同的矩形数组,以确保在两种情况下所有的变换都是相同的.代码段如下:
CRect rect = ...;
// Draw the rectangle using GDI
CPen cpen(PS_DASH, 0, RGB(0,0,255));
pDC->SelectObject(&cpen);
pDC->Rectangle(rect);
{
// Draw the rectangle using GDI+
Gdiplus::Graphics graphics(pDC->m_hDC);
Gdiplus::Pen pen(Gdiplus::Color(180,180,180));
graphics.DrawRectangle(
&pen,
Gdiplus::Rect(rect.left, rect.top, rect.Width(), rect.Height()));
}
Run Code Online (Sandbox Code Playgroud)
结果如下:(蓝色虚线由GDI绘制,灰色由GDI +绘制)
我可以清楚地看到两个坐标系是不同的.我期待一些舍入错误,但不是这里看到的缩放错误.此外,当我更改缩放系数时,GDI +会根据变焦在两个方向上跳跃±4像素.这也在屏幕截图中突出显示,因为与GDI矩形相比,GDI +矩形在X轴上具有正偏移并且在Y轴上具有负偏移.
有谁知道这里发生了什么?
我该如何调查/调试这个?这发生在窗户的内部,所以我很遗憾无法调试它.
作为参考,这是我的视口/窗口org/ext的样子:
Window Ext: (134000, 80500)
Window Org: (0, 0)
Viewport Ext: (1452 872)
Viewport …Run Code Online (Sandbox Code Playgroud) 我正在调整触摸屏界面的应用程序,我们想要使用Windows Vista/7中包含的平板电脑文本输入面板,特别是其键盘.我想根据我的应用显示和隐藏它.基本上我想要ShowKeyboard()和HideKeyboard()功能.控制它的最佳方法是什么?
我查看了ITextInputPanel API但我无法直接用它控制键盘(也许我错过了什么?).我也试图向其窗口发送窗口消息失败.
该应用程序是用C++/MFC编写的.
任何指针都非常感谢.
我想知道如何fn从类中定义一个方法来访问ruby中的全局函数fn.我通过别名函数做了一个解决方法,如下所示:
def fn
end
class Bar
alias global_fn fn
def fn
# how to access the global fn here without the alias
global_fn
end
end
我正在寻找c ++的::以访问全局范围的东西,但我似乎找不到任何有关它的信息.我想我不知道具体到底是什么.
我有一个问题,在调用第三方库例程期间,我的进程终止.我完全无法在调试器中捕获这个.这可能与此问题有关:如何调试意外终止的win32进程?.
当我调用此库中的调用时,正在调试的进程只会终止.如果此终止是由于未处理的异常或内存访问冲突导致的,则调试器会捕获它.所以我最好的猜测是该过程以某种方式正常终止.
我尝试过的:
ExitThread和上设置断点ExitProcessset_terminate和_set_invalid_parameter_handler)_set_abort_behavior和_set_error_mode.但无济于事,没有一个处理程序被调用,也没有触发任何断点.
我观察到的: 当进程崩溃时,我在调试输出窗口中看到两件事:
没有关系(见下面的更新) 我看到EEFileLoadException被扔了.快速谷歌这个例外并没有给我一个明确的答案,这个例外意味着什么.
First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: Microsoft C++ exception: EEFileLoadException at memory location 0x0030b5ac..
First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..
First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..
First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: 0xE0434352: …Run Code Online (Sandbox Code Playgroud)我想知道Visual Studio如何将MFC CDialog派生类与其对应的对话框资源相关联.我不感兴趣的连接是如何在运行时作出(如询问这里),而是在设计时.
当我向对话框添加消息处理程序时,它如何知道要将处理程序添加到哪个类.此外,是否可以将多个CDialog派生类与相同的对话框资源相关联,反之亦然?
我在项目目录中搜索了IDD_SOMEDIALOG字符串但是只找到了它SomeDialog.h,resource.h并且Project.rc在预期的位置,所以我猜它以某种方式推断出这些文件的连接,很可能是枚举SomeDialog.h:
// in class CSomeDialog:
enum { IDD = IDD_SOMEDIALOG };
Run Code Online (Sandbox Code Playgroud)
我主要是出于好奇而问这个问题.
我制作了一个示例应用程序,它构建了一个过滤器图形,用于从麦克风中捕获音频并将其传输到文件中.是否有任何过滤器允许我流式传输到内存缓冲区?
我正在遵循msdn上的文章中概述的方法,并且正在使用该CLSID_FileWriter 对象将音频写入文件.这很好用,但我无法弄清楚如何写入内存缓冲区.
是否有这样的内存接收器过滤器或我是否必须自己创建它?(我更喜欢与Windows XP捆绑在一起的)
我想通知用户我的应用程序想要使用该标准启动升级过程MessageBox.有没有办法实现这种重新实现的缺点MessageBox?
例如,对于标准按钮,您可以发送BCM_SETSHIELD消息.消息框有类似的东西吗?
c++ ×3
winapi ×3
windows ×3
mfc ×2
visual-c++ ×2
debugging ×1
dialog ×1
directshow ×1
gdi ×1
gdi+ ×1
ruby ×1
scope ×1
windows-xp ×1