我想知道如何使用具有特定客户区大小的 Win32 API创建窗口.
当尝试使用以下代码创建窗口时,整个窗口为640x480,窗口的chrome占用了一些客户区域:
HWND hWnd;
WNDCLASSEX WndClsEx;
ZeroMemory(&WndClsEx, sizeof(WNDCLASSEX));
WndClsEx.cbSize = sizeof(WNDCLASSEX);
WndClsEx.style = CS_HREDRAW | CS_VREDRAW;
WndClsEx.lpfnWndProc = DefWindowProc;
WndClsEx.cbClsExtra = 0;
WndClsEx.cbWndExtra = 0;
WndClsEx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClsEx.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClsEx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
WndClsEx.lpszMenuName = NULL;
WndClsEx.lpszClassName = TEXT("Title");
WndClsEx.hInstance = hInstance;
WndClsEx.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&WndClsEx);
hWnd = CreateWindowEx( NULL,
TEXT("Title"),
TEXT("Title"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
640,
480,
NULL,
NULL,
hInstance,
NULL);
Run Code Online (Sandbox Code Playgroud)
假设简单的数学不能解决问题,我该如何考虑铬尺寸?
注意:我在创建窗口后使用SDL,但我猜它与窗口大小绑定并且与其大小没有区别.
使用C#,我很容易就能得到我想要的效果:
然而,我无法做用下的Win32 API的,我不知道如何创建具有窗口同样的事情没有图标(在所有),但仍然有一个标题,最小化按钮,以及关闭按钮.
我正确地注册了我的课程,但我无法弄清楚要为窗口样式/扩展窗口样式添加什么.
static const TCHAR lpctszTitle[] = TEXT("Stuff"), lpctszClass[] =
TEXT("StuffClass");
HWND hWnd = CreateWindowEx(WS_EX_LAYERED | WS_EX_TOPMOST, lpctszClass,
lpctszTitle, WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX,
CW_USEDEFAULT, 0, 250, 55, NULL, NULL, hThisInstance, NULL);
Run Code Online (Sandbox Code Playgroud)
上面的代码产生了:
它仍然在标题栏中有一个图标,而不是我想要的.
我想知道是否可以为创建的子窗口指定WndProc CreateWindowEx
.
我已经创建了一个Window类,主窗口,窗口过程和一个消息循环.该代码有效,我决定将其保留,以便明确我的问题.
到目前为止,这是我的Window Proc:
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
// Creation of the Win32 Window
case WM_CREATE:
// Add an Edit Field
CreateWindowEx(
WS_EX_CLIENTEDGE,
"EDIT",
"",
WS_CHILD | WS_VISIBLE,
5, 5, 200, 24,
hwnd,
(HMENU)100,
g_Instance, // Comming from WinMain
NULL
);
return DefWindowProc(hwnd, uMsg, lParam, wParam);
case WM_KEYDOWN:
// Track key presses on the edit field
std::cout << "The key with the code " << wParam << " …
Run Code Online (Sandbox Code Playgroud) 我已经确定我可以使用GetSystemMetrics(SM_CMONITORS)来查询连接的监视器的数量,但是他们可以通过什么方式来控制CreateWindowEx()用于窗口的监视器?
以下是我的代码的一部分.每次运行程序时,CreateWindowEx
SPanel都会返回NULL
,触发错误.任何人都可以看到这段代码有什么问题吗?
SPanelProc
并且MainWndProc
已经宣布,并且是原型LRESULT CALLBACK SPanelProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
.
我正在编程的环境是Visual C++ 2010.
为什么CreateWindowEx
总是回来NULL
?
#include <Windows.h>
#include <WindowsX.h>
LRESULT CALLBACK SPanelProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_MOUSEMOVE:
break;
}
return 0;
}
void Init ()
{
HWND child;
HINSTANCE hInstance = (HINSTANCE)(GetWindowLongPtr (parent, GWLP_HINSTANCE));
WNDCLASSEX wc;
const char PanelClassName[] = "SPanel"; //ClassName of the panel. Do not …
Run Code Online (Sandbox Code Playgroud) c++ winapi visual-studio-2010 createwindowex visual-c++-2010
当我单击主窗口上的按钮时,我试图创建一个弹出窗口,而我正在使用CreateWindowEX函数。但是,CreateWindowEx函数将HINSTANCE类型变量作为倒数第二个参数。假设单击按钮时我是从WndProcedure内部创建此新窗口的,所以WinMain函数中的HINSTANCE变量对我来说将不可用,因为它不是全局变量。
从WndProcedure回调函数获得以下代码:
case IDC_BUTTON PRESSED:
{
const char g_szClassName2[] = "POPWIND";
const char WndName2[] = "POPUP WINDOW";
HWND invisWindowHandle = CreateWindowEx(0,
g_szClassName2,
WndName2,
WS_OVERLAPPEDWINDOW,
200,
200,
800,
500,
NULL,
NULL,
hInstance,//THIS IS THE VARIABLE I AM HAVING TROUBLE GETTING
NULL);
ShowWindow(invisWindowHandle, 3);// SW_SHOWNORMAL);
UpdateWindow(invisWindowHandle);
}
Run Code Online (Sandbox Code Playgroud)
我该如何获取所需的hInstance变量,以便CreateWindowEx函数从WndProcedure回调函数内部运行?
注意:我考虑过将hInstance变量设置为全局变量,但是我不确定我的应用程序创建的每个窗口是否都必须使用相同的hInstance。
我有个问题。我想记录我的工具开发,所以我想让窗口名称带有日期和时间数据,而不是在屏幕截图顶部使用 mspaint 来显示日期。但是我只有中文字符而不是字符串。
这是我想将字符串分配给 CreateWindowEx() 的代码:
char *wndName = "Asphyx V0.01 (Build Date: " __DATE__ " " __TIME__ ")\0";
hWnd = CreateWindowEx(NULL,
L"WindowClass",
(LPCWSTR)wndName,
WS_OVERLAPPEDWINDOW,
300,
300,
wr.right - wr.left,
wr.bottom - wr.top,
NULL,
NULL,
hInstance,
NULL);
Run Code Online (Sandbox Code Playgroud)
编辑:伙计们,我很欣赏你的回答,但他们都给了我这个
Error 29 error C2308: concatenating mismatched strings
Run Code Online (Sandbox Code Playgroud)
唯一有点工作的东西是一个尚未删除的答案,但它给了我这个:
他使用了这个代码:
char title[256];
sprintf(title, "Asphyx V0.01 (Build Date: %s - %s)", __DATE__, __TIME__);
hWnd = CreateWindowEx(NULL,
L"WindowClass",
title,
WS_OVERLAPPEDWINDOW,
300,
300,
wr.right - wr.left,
wr.bottom - wr.top,
NULL,
NULL,
hInstance,
NULL);
Run Code Online (Sandbox Code Playgroud)