- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我一直在关注 MSDN's guide to using the DWM API to extend the frame into the client area ,但重做了,这样我就可以在我有一些工作时进行试验。
但是,当我在 Visual Studio 2013 x64 Native Tools 命令行中使用 cl wincompositiontest.cpp
构建它时,程序不会绘制窗口边框。标准窗口按钮确实有效:我可以看到 Windows 7 按钮发光和工具提示,单击按钮会执行各自的操作(因此我可以关闭此窗口)。但没有别的工作:我不能用边缘移动或调整窗口大小,而且边框不绘制,而是绘制白色:
DwmExtendFrameIntoClientArea()
返回 S_OK
。
这是怎么回事?这是在 VirtualBox 中运行的 Windows 7 x64 上;我把代码给了一个也在真实硬件上运行 Windows 7 的 friend ,他们得到了相同的结果。谢谢。
// 12 december 2016
#define UNICODE
#define _UNICODE
#define STRICT
#define STRICT_TYPED_ITEMIDS
// get Windows version right; right now Windows Vista
// unless otherwise stated, all values from Microsoft's sdkddkver.h
// TODO is all of this necessary? how is NTDDI_VERSION used?
// TODO plaform update sp2
#define WINVER 0x0600 /* from Microsoft's winnls.h */
#define _WIN32_WINNT 0x0600
#define _WIN32_WINDOWS 0x0600 /* from Microsoft's pdh.h */
#define _WIN32_IE 0x0700
#define NTDDI_VERSION 0x06000000
#include <windows.h>
#include <commctrl.h>
#include <uxtheme.h>
#include <windowsx.h>
#include <shobjidl.h>
#include <d2d1.h>
#include <d2d1helper.h>
#include <dwrite.h>
#include <usp10.h>
#include <msctf.h>
#include <textstor.h>
#include <olectl.h>
#include <shlwapi.h>
#include <dwmapi.h>
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#include <wchar.h>
#include <stdarg.h>
#include <stdio.h>
#include <math.h>
#include <float.h>
#include <inttypes.h>
#include <vector>
#include <map>
#include <string>
#pragma comment(linker, \
"\"/manifestdependency:type='Win32' " \
"name='Microsoft.Windows.Common-Controls' " \
"version='6.0.0.0' " \
"processorArchitecture='*' " \
"publicKeyToken='6595b64144ccf1df' " \
"language='*'\"")
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "gdi32.lib")
#pragma comment(lib, "comctl32.lib")
#pragma comment(lib, "uxtheme.lib")
#pragma comment(lib, "dwmapi.lib")
#define HR(call) printf("%s -> 0x%I32X\n", #call, call)
LRESULT CALLBACK wndproc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
RECT r;
MARGINS margins;
BOOL dwmHandled;
LRESULT lResult;
dwmHandled = DwmDefWindowProc(hwnd, uMsg, wParam, lParam, &lResult);
switch (uMsg) {
case WM_CREATE:
GetWindowRect(hwnd, &r);
SetWindowPos(hwnd, NULL,
r.left, r.top,
r.right - r.left, r.bottom - r.top,
SWP_FRAMECHANGED);
// TODO if we pass SWP_NOOWNERZORDER || SWP_NOZORDER, the default frame is not correctly inhibited
break;
case WM_ACTIVATE:
margins.cxLeftWidth = 8;
margins.cxRightWidth = 8;
margins.cyBottomHeight = 20;
margins.cyTopHeight = 27;
HR(DwmExtendFrameIntoClientArea(hwnd, &margins));
break;
case WM_NCCALCSIZE:
if (wParam != (WPARAM) FALSE)
return 0;
break;
case WM_CLOSE:
PostQuitMessage(0);
break;
}
if (dwmHandled)
return lResult;
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
}
int main(void)
{
WNDCLASSW wc;
HWND mainwin;
MSG msg;
ZeroMemory(&wc, sizeof (WNDCLASSW));
wc.lpszClassName = L"mainwin";
wc.lpfnWndProc = wndproc;
wc.hInstance = GetModuleHandle(NULL);
wc.hIcon = LoadIconW(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursorW(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
RegisterClassW(&wc);
mainwin = CreateWindowExW(0,
L"mainwin", L"Main Window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
400, 400,
NULL, NULL, GetModuleHandle(NULL), NULL);
ShowWindow(mainwin, SW_SHOWDEFAULT);
UpdateWindow(mainwin);
while (GetMessageW(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
return 0;
}
最佳答案
为了与 Windows 10 兼容,左/右/下边距应为零。
通常你只需要改变标题栏区域。因此,只需更改 margins.cyTopHeight
使用 AdjustWindowRectEx
计算给定窗口样式的默认边框宽度,并将这些值传递给 WM_NCCALCSIZE
,这将显示默认边框。
DwmDefWindowProc
是响应 WM_NCHITTEST
和 WM_NCMOUSELEAVE
所必需的(但也许您设置它的方式对于将来的兼容性更好)
您还必须处理 WM_PAINT
以使系统按钮正确显示。隐藏系统按钮并绘制您自己的按钮可能更容易,因此标题栏是完全自定义的,具有自己的背景颜色。
下面是 Windows 10 的示例,它应该适用于 Windows 7。应用程序应该知道 DPI,否则会出现带边框的小显示问题。
void paint_caption(HWND hWnd, HDC hdc, int caption_height)
{
RECT rc;
GetClientRect(hWnd, &rc);
rc.bottom = caption_height;
HDC memdc = CreateCompatibleDC(hdc);
BITMAPINFOHEADER bmpInfoHdr =
{ sizeof(BITMAPINFOHEADER), rc.right, -rc.bottom, 1, 32 };
HBITMAP hbitmap =
CreateDIBSection(memdc, (BITMAPINFO*)(&bmpInfoHdr), DIB_RGB_COLORS, 0, 0, 0);
HGDIOBJ oldbitmap = SelectObject(memdc, hbitmap);
//Note, GDI functions don't support alpha channel, they can't be used here
//Use GDI+, BufferedPaint, or DrawThemeXXX functions
BitBlt(hdc, 0, 0, rc.right, caption_height, memdc, 0, 0, SRCCOPY);
SelectObject(memdc, oldbitmap);
DeleteObject(hbitmap);
DeleteDC(memdc);
}
LRESULT CALLBACK wndproc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
//static MARGINS margins = { -1,-1,100,-1 };
static MARGINS margins = { 0,0,100,0 };
static RECT border_thickness = { 0 };
switch(uMsg)
{
case WM_CREATE:
if(GetWindowLongPtr(hwnd, GWL_STYLE) & WS_THICKFRAME)
{
AdjustWindowRectEx(&border_thickness,
GetWindowLongPtr(hwnd, GWL_STYLE) & ~WS_CAPTION, FALSE, NULL);
border_thickness.left *= -1;
border_thickness.top *= -1;
}
else if(GetWindowLongPtr(hwnd, GWL_STYLE) & WS_BORDER)
{
border_thickness = { 1,1,1,1 };
}
DwmExtendFrameIntoClientArea(hwnd, &margins);
SetWindowPos(hwnd, NULL, 0, 0, 0, 0,
SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);
break;
case WM_NCCALCSIZE:
if(lParam)
{
NCCALCSIZE_PARAMS* sz = (NCCALCSIZE_PARAMS*)lParam;
sz->rgrc[0].left += border_thickness.left;
sz->rgrc[0].right -= border_thickness.right;
sz->rgrc[0].bottom -= border_thickness.bottom;
return 0;
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
//paint caption area
paint_caption(hwnd, hdc, margins.cyTopHeight);
EndPaint(hwnd, &ps);
return 0;
}
case WM_NCHITTEST:
{
//handle close/minimize/maximize/help button
LRESULT lResult;
if (DwmDefWindowProc(hwnd, uMsg, wParam, lParam, &lResult))
return lResult;
//do default processing, except change the result for caption area
lResult = DefWindowProc(hwnd, uMsg, wParam, lParam);
if(lResult == HTCLIENT)
{
POINT pt = { LOWORD(lParam), HIWORD(lParam) };
ScreenToClient(hwnd, &pt);
if(pt.y < border_thickness.top) return HTTOP;
if(pt.y < margins.cyTopHeight) return HTCAPTION;
}
return lResult;
}
case WM_NCMOUSELEAVE:
{
LRESULT lResult;
if(DwmDefWindowProc(hwnd, uMsg, wParam, lParam, &lResult))
return lResult;
break;
}
case WM_CLOSE:
PostQuitMessage(0);
break;
}
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
}
Windows 10 中的结果:
赢 7:
关于c++ - 为什么我的 DwmExtendFrameIntoClientArea() 窗口没有绘制 DWM 边框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41106347/
我的文本字段需要一个边框,如下图所示。我该怎么做? 最佳答案 试试这些..我希望它能帮助... UITextField *txt=[[UITextField alloc]initWithFrame:C
我尝试通过“GradientDrawable”改变颜色“描边”,但不起作用。 另外,我不知道如何获取 id stroke,并且只更改笔划(我看到 google,所有示例都失败了) 我的 XML 项目
有没有办法如何使用css(理想)来绘制元素边框但只是线条的一部分(在左右边框下方的图像中)? 最佳答案 是的,你可以,像这样,甚至 IE8 也可以这样做: div { position: re
我一直致力于自定义 GUI 框架,因为我无法处理需要通过标记 (XAML) 开发 UI 的托管废话或 native 代码。我正在尝试创建一个使用该 GUI 框架的应用程序原型(prototype),但
以下Microsoft example code包含以下内容: ... ... ... 但是,在运行时,此代码会生成以下数据绑定(bind)
所以基本上我在tex文件的顶部有这样的内容: \setbeamertemplate{footline}{Number \insertframenumber} 这会将“Number ”应用于所有帧的页脚
我不明白为什么我的 HBox 周围没有边框?现在什么也没有发生,除了 eclipse 抛出 IllegalArgumentException 之外,因为我猜是 this.setCenter(hbox)
我正在尝试使用 Colorbox,以便它在加载时打开并提醒访问者 session 注册已开放。我在 Javascript Coder 找到了我正在使用的代码。 我无法让“X”关闭Colorbox来显示
我制作了一个自定义面板,类似于 WrapPanel 但带有列(或类似于 Grid 但项目自动定位在网格中)。 这是它的样子: 我想在我的面板上有一个属性,它在每一列之间划一条线。是否可以在自定义面板上
我正在尝试为我的页面制作边框,但我没有这样做..我的代码是 @drawable/custom_border 我的问题是,黑色设置为整个 View (作为背景),我想要黑色边框而不是黑色背景
我目前正在开发一个小游戏,但我无法让圆圈正确击中左侧和顶部 Canvas 边框。它正确地击中了右侧和底部。 圆可以用 W A S D 移动,并且必须正确地碰到 Canvas 的所有边界 这是代码:ht
我有一个像这样的图像 slider :
如何绘制具有透明度的png图像轮廓(边框)。 就像我们有这张图片: 我们想要这个: 我正在通过 HTML5 创建图像阴影,但无法获得我想要的。我想使用 HTML5 或 jquery 或两者来绘制它,如
在我们的主页上,我们有几个元素作为菜单点。(图片+标题+小说明)。问题是当鼠标悬停时,菜单元素总是有边框。 (即使我隐藏边框)。 你可以看看:www.scf-software.com 图片问题: im
我对 HTML 和 CSS 完全陌生,所以我希望有人能给我指出正确的方向。我试图理解本教程以制作视差滚动网站: http://ihatetomatoes.net/simple-parallax-scr
如何使底部边框正好位于文本框下方? div { border-bottom: solid 2px #354458; } p { color: #ffffff; background-col
本质上,我想应用一个 bottom-border,但我不希望它位于单元格的底部,而是位于死 Angular 。 如何仅使用 CSS 和 HTML(并且不使用图形)做到这一点? 假设单元格/行的高度为
我有一个带有线性渐变的 block (div)。有没有可能让右上角切出一个三 Angular 形? 例如,你有 border-radius 5px 来制作一个圆 Angular 的 block 。但是
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
我想按照下面的设计图实现下拉按钮。查看下拉菜单在按钮中间后开始。我的问题是按钮具有透明背景以利用根父 div 中的背景图像。 到目前为止,我已经实现了下图。正如我上面所说,我想在 border-rad
我是一名优秀的程序员,十分优秀!