我目前正在开发一个Win32程序,它需要一个包含许多子窗口控件的主窗口 - 按钮,列表视图等.我认为构建这样一个窗口的标准方法是首先为主窗口调用CreateWindow,然后再为每个控件调用.
作为一个更简单的选项,我正在考虑使用资源编辑器的对话框设计器设计主窗口,然后使用CreateDialog一次构建主窗口.
通过在对话框模板中使用CLASS语句,我应该能够使主窗口使用自定义窗口类(因此自定义窗口过程),从而避免窗口具有任何类似对话框的行为.这种技术的一个例子可以在Charles Petzold的"Programming Windows"中找到:第11章中的HEXCALC程序.
以这种方式创建主窗口有什么缺点吗?如果是这样,他们是什么?如果没有,为什么这种方法很少使用?
我在Windows Vista上使用C++中的VS2005创建了一个带有createwindow()api的窗口
我的要求是在该窗口上绘制一个图像(任何格式).我在这个应用程序中没有使用任何MFC.
我有一个功能:
HWND createMainWindow(P2p_Socket_Machine * toSend){
HWND hMainWnd = CreateWindow(
L"Class",/*(LPCWSTR) nameOfConference.c_str()*/L"Chat", WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU,
CW_USEDEFAULT, 0, 600,400,
(HWND)NULL, (HMENU)NULL,
/*(HINSTANCE)hlnstance*/NULL, NULL
);
if (!hMainWnd) {
MessageBox(NULL, L"Cannot create main window", L"Error", MB_OK);
return 0;
}
CreateWindowA("LISTBOX",NULL, WS_CHILD|WS_VISIBLE|WS_BORDER|WS_VSCROLL|LBS_NOTIFY|LBS_MULTIPLESEL,310,30,255,275,hMainWnd,(HMENU)List_Box,NULL,NULL);
CreateWindowExA(NULL,"BUTTON", "Refresh", WS_TABSTOP|WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON,385,310,100,24,hMainWnd,(HMENU)Button_Refresh, NULL ,NULL);
CreateWindowExA(NULL,"BUTTON", "Send", WS_TABSTOP|WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON,385,334,100,24,hMainWnd,(HMENU)Button_Send, NULL ,NULL);
CreateWindowExA(NULL,"BUTTON", "New", WS_TABSTOP|WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON,385,354,100,24,hMainWnd,(HMENU)Button_New, NULL ,NULL);
CreateWindowA("EDIT",0,WS_BORDER|WS_VISIBLE|WS_CHILD|ES_LEFT|ES_MULTILINE|WS_VSCROLL|WS_DISABLED,
10,30,265,275,hMainWnd,(HMENU)Text_Box_Get,NULL,NULL);
CreateWindowA("EDIT",0,WS_BORDER|WS_VISIBLE|WS_CHILD|ES_LEFT|ES_MULTILINE|WS_VSCROLL,
10,320,265,45,hMainWnd,(HMENU)Text_Box_Send,NULL,NULL);
SetWindowLongPtr(hMainWnd,GWLP_USERDATA,(LONG_PTR)toSend);
ShowWindow(hMainWnd, SW_SHOW);
//UpdateWindow(hMainWnd);
return hMainWnd;
}
Run Code Online (Sandbox Code Playgroud)
这是我的计划的主要部分:
int WINAPI WinMain(HINSTANCE hlnstance, HINSTANCE hPrevInstance, LPSTR IpCmdLine, int
nCmdShow)
{
WNDCLASSEX wc;
wc.cbSize …Run Code Online (Sandbox Code Playgroud) 我希望使用C#带有setted parent的窗口创建我定义的句柄,这是另一个进程窗口句柄.
有人知道怎么做吗?
问候,
我创建了一个窗口,其句柄是handle_parent。然后我创建了一个子窗口,如下所示:
hwnd_child = CreateWindow(child_class_name, _T(""),
WS_CHILDWINDOW, 0, 0, 0, 0, hwnd_parent, (HMENU)0, ghinst, NULL);
ShowWindow(win->hwndSplitterBar, SW_SHOW);
UpdateWindow(win->hwndSplitterBar);
Run Code Online (Sandbox Code Playgroud)
我想设置子窗口“child”的颜色。如果我什么都不做,默认颜色是灰色的。我怎样才能设置它的颜色?我想永久保持黑色,无论如何都要改变。
我经历过多个网站,文档和教程,他们都说相同的,那就是,任何控制只不过是一个窗口,更在Win32中的API,因此,一个能够使用的CreateWindowExW()功能来创建一个ListBox在主控制/窗口应用程序窗口
虽然我得到所有控件的概念都是具有不同dwStyle的窗口,但我很难找到如何实例化ListBox控件.
我遇到了一个教程,其中编写了一个对话框LISTBOX,其声明中的指定如下:
// resource.h
#define IDD_MAIN 101
#define IDC_TEXT 1000
#define IDC_NUMBER 1001
#define IDC_LIST 1002
#define IDC_ADD 1003
#define IDC_CLEAR 1004
#define IDC_REMOVE 1005
#define IDC_SHOWCOUNT 1006
// .rc resource file
IDD_MAIN DIALOG DISCARDABLE 0, 0, 207, 156
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Controls One"
FONT 8, "MS Sans Serif"
BEGIN
LTEXT "Add",IDC_STATIC,7,10,14,8
EDITTEXT IDC_TEXT,25,7,120,14,ES_AUTOHSCROLL
EDITTEXT IDC_NUMBER,150,7,21,14,ES_NUMBER
LTEXT "times.",IDC_STATIC,177,10,23,8
LISTBOX IDC_LIST,7,25,138,106,LBS_NOINTEGRALHEIGHT | …Run Code Online (Sandbox Code Playgroud) 使用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)
上面的代码产生了:

它仍然在标题栏中有一个图标,而不是我想要的.
我正在使用CreateWindowEx创建一个Edit控件(一个文本框),但是说CW_DEFAULT没有帮助获取文本框的默认高度 - 它只是创建一个高度为零的窗口.
如何获取文本框的系统默认大小,以便将Edit控件转换为看似正常的文本框?
我有一个严重的问题QWebView :: createWindow()以及如何处理创建新的浏览器窗口.
我按照docs(MyWebView)的说法对QWebView进行了细分,并重新实现了它的createWindow()方法以及它的contextMenuEvent(QContextMenuEvent*event)方法,以便我可以添加和更改自己的菜单条目.
上下文菜单条目"打开链接","在新标签中打开链接"和"打开图像"都可以正常工作,如果选择"打开链接",则打开所需的链接/图像到相同的选项卡,如果其中一个,则打开到新选项卡中其他三个"Open ..."条目被选中.此外,当单击要在新窗口中打开的网页时,它们将按预期在新选项卡中打开.
但是,我添加了一个名为"在新窗口中打开链接"的新菜单条目,因为我的生活无法使其正常工作.它会打开全新的浏览器窗口,但不会加载点击的网址.更糟糕的是,如果我手动将一些www地址输入到这个新的浏览器窗口,然后尝试打开新标签,它们将在旧窗口中打开!
有人可以请检查我的代码有什么问题吗?
首先,MyWebView构造函数:
MyWebView::MyWebView(QWidget * parent):
QWebView(parent),newWindow(false)
{
this->myPage = new MyWebPage;
this->setPage(this->myPage);
/* Just change text and nothing more ... */
this->action_openLinkInNewWindow = this->pageAction(QWebPage::OpenLinkInNewWindow);
if(this->action_openLinkInNewWindow) {
if(this->action_openLinkInNewWindow->isEnabled()) {
this->action_openLinkInNewWindow->setText("Open Link in New Window");
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后"打开图像","在新窗口中打开链接"和"在新窗口中打开链接"功能(默认"打开链接"工作得很好,所以我不需要重新实现那个)
void MyWebView::openImage()
{
#ifndef NDEBUG
qDebug() << "=================================================";
qDebug() << __FUNCTION__ << " called ...";
#endif
this->imageUrl = true;
this->newWindow = false;
this->createWindow(QWebPage::WebBrowserWindow);
}
void MyWebView::openLinkInNewTab()
{
#ifndef NDEBUG
qDebug() << "=================================================";
qDebug() << __FUNCTION__ << …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,该函数CreateWindow由于某种原因失败. GetLastError表示错误1407,根据MSDN文档,"无法找到窗口类".以下代码显示了CreateWindow在调用时如何调用以及相应的变量名称:
m_hInstance = ::GetModuleHandle( NULL );
if ( m_hInstance == NULL )
{
TRACE(_T("CNotifyWindow::CNotifyWindow : Failed to retrieve the module handle.\r\n\tError: %d\r\n\tFile: %s\r\n\tLine: %d\r\n"), ::GetLastError(), __WFILE__, __LINE__);
THROW(::GetLastError());
}
m_hWnd = ::CreateWindow(
_pwcWindowClass, // L"USBEventNotificationWindowClass"
_pwcWindowName, // L"USBEventNotificationWindow"
WS_ICONIC,
0,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
m_hInstance, // 0x00400000
NULL
);
if ( m_hWnd == NULL ) // m_hWnd is returned as NULL and exception is thrown.
{
TRACE(_T("CNotifyWindow::CNotifyWindow : Failed to create window.\r\n\tError: %d\r\n\tFile: …Run Code Online (Sandbox Code Playgroud)