C++ 如何使用纯WINAPI在渐变背景上显示控件?

C++ 如何使用纯WINAPI在渐变背景上显示控件?,c++,c,winapi,C++,C,Winapi,在我的程序中,我试图创建一个子窗口(通过CreateWindow(“STATIC”,…))来包含一些其他控件,如编辑框和按钮。但是,我希望这个静态控件的背景是渐变 我的目标是将如下内容作为子窗口: 到目前为止,我的努力已经产生了创建窗口时控件可见的效果,但一旦使用WM_ERASEBKGND重新绘制,控件就会隐藏在绘制的渐变后面 我可以找到很多关于绘制渐变(或其他类似的图形背景)以及独立创建带有控件的窗口的示例。但我还没有找到同时拥有这两种功能的任何资源 下面是我的示例代码: #包括 #prag

在我的程序中,我试图创建一个子窗口(通过
CreateWindow(“STATIC”,…)
)来包含一些其他控件,如编辑框和按钮。但是,我希望这个静态控件的背景是渐变

我的目标是将如下内容作为子窗口:

到目前为止,我的努力已经产生了创建窗口时控件可见的效果,但一旦使用
WM_ERASEBKGND
重新绘制,控件就会隐藏在绘制的渐变后面

我可以找到很多关于绘制渐变(或其他类似的图形背景)以及独立创建带有控件的窗口的示例。但我还没有找到同时拥有这两种功能的任何资源

下面是我的示例代码:

#包括
#pragma comment(lib,“Msimg32”)//为GradientFill加载该dll
//全局宏
inline COLOR16 ToColor16(BYTE-BYTE){return BYTE您可以将样式添加到父窗口:

FillBox = CreateWindow(TEXT("STATIC"),
    TEXT(""),
    WS_VISIBLE | WS_CHILD | WS_BORDER | WS_EX_CLIENTEDGE | WS_CLIPCHILDREN,
    Section1[1].lrPos,
    Section1[1].udPos,
    Section1[1].width,
    Section1[1].height,
    hWnd,                   // child of parent
    (HMENU)8200,
    hInst,
    NULL);
绘制父窗口时,这将不包括其子窗口,这适用于我:


如果要创建一个窗口作为某些控件的容器,最明显的选择通常是创建一个对话框。它已经(自动)处理了您现在正在做的大部分事情,以及一些您可能想要(例如使用选项卡在控件之间移动)但尚未处理的事情

因此,例如,从一个通用的Windows应用程序开始,我将默认的
About
框更改为大致承载您想要的控件,然后在应用程序初始化时将其弹出为无模式对话框

//frame.cpp:定义应用程序的入口点。
//
#包括“framework.h”
#包括“frame.h”
#pragma comment(lib,“Msimg32”)//为GradientFill加载该dll
#定义最大加载字符串100
//全局变量:
HINSTANCE hInst;//当前实例
WCHAR szTitle[MAX_LOADSTRING];//标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING];//主窗口类名
//转发此代码模块中包含的函数声明:
ATOM MyRegisterClass(HINSTANCE HINSTANCE);
BOOL InitInstance(HINSTANCE,int);
LRESULT回调WndProc(HWND、UINT、WPARAM、LPARAM);
INT_PTR回调关于(HWND、UINT、WPARAM、LPARAM);
国际货币基金组织,
_在当前情况下,
_在LPWSTR lpCmdLine中,
_In_uuint(nCmdShow)
{
未引用的_参数(HPPreInstance);
未引用的_参数(lpCmdLine);
//TODO:将代码放在这里。
//初始化全局字符串
LoadStringW(hInstance、IDS\U APP\U TITLE、szTitle、MAX\U LOADSTRING);
LoadStringW(hInstance、IDC_框架、szWindowClass、MAX_LOADSTRING);
MyRegisterClass(hInstance);
//执行应用程序初始化:
如果(!InitInstance(hInstance,nCmdShow))
{
返回FALSE;
}
HACCEL hAccelTable=装载加速器(hInstance、MAKEINTRESOURCE(IDC_帧));
味精;
//主消息循环:
while(GetMessage(&msg,nullptr,0,0))
{
if(!TranslateAccelerator(msg.hwnd、hAccelTable和msg))
{
翻译信息(&msg);
发送消息(&msg);
}
}
返回(int)msg.wParam;
}
//
//函数:MyRegisterClass()
//
//目的:注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE HINSTANCE)
{
WNDCLASSEXW wcex;
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.style=CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc=WndProc;
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hInstance=hInstance;
wcex.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_帧));
wcex.hCursor=LoadCursor(nullptr,IDC_箭头);
wcex.hbrBackground=(HBRUSH)(彩色窗口+1);
wcex.lpszMenuName=MAKEINTRESOURCEW(IDC_帧);
wcex.lpszClassName=szWindowClass;
wcex.hIconSm=LoadIcon(wcex.hInstance,MAKEINTRESOURCE(IDI_SMALL));
返回寄存器CLASSEXW(&wcex);
}
//
//函数:InitInstance(HINSTANCE,int)
//
//用途:保存实例句柄并创建主窗口
//
//评论:
//
//在这个函数中,我们将实例句柄保存在一个全局变量中,然后
//创建并显示主程序窗口。
//
BOOL InitInstance(HINSTANCE HINSTANCE,int nCmdShow)
{
hInst=hInstance;//将实例句柄存储在全局变量中
HWND HWND=CreateWindowW(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,
CW_usefault,0,CW_usefault,0,nullptr,nullptr,hInstance,nullptr);
如果(!hWnd)
{
返回FALSE;
}
显示窗口(hWnd、nCmdShow);
更新窗口(hWnd);
返回TRUE;
}
//
//功能:WndProc(HWND、UINT、WPARAM、LPARAM)
//
//用途:处理主窗口的消息。
//
//WM_命令-处理应用程序菜单
//WM_绘制-绘制主窗口
//WM_DESTROY-发布退出消息并返回
//
//
LRESULT回调WndProc(HWND HWND,UINT消息,WPARAM WPARAM,LPARAM LPARAM)
{
静态HWND对话框;
开关(信息)
{
案例WM_创建:
dialog=CreateDialog(hInst,MAKEINTRESOURCE(IDD_ABOUTBOX),hWnd,About);
显示窗口(对话框,软件显示);
打破
case WM_命令:
{
int wmId=低ORD(wParam);
//解析菜单选项:
交换机(wmId)
{
案例IDM_退出:
窗口(hWnd);
打破
违约:
返回DefWindowProc(hWnd、message、wParam、lParam);
}
}
打破
案例WM_油漆:
{
PAINTSTRUCT-ps;
HDC HDC=开始喷漆(hWnd和ps);
//TODO:在此处添加任何使用hdc的图形代码。。。
端漆(hWnd和ps);
}
打破
案例WM_销毁: