×

createwindow 函数

createwindow(CreateWindow函数的第三个参数包含LBS_NOTIFY有什么作用LBS_SORT有什么作用LBS_MULTIPLESEL有什么作用)

admin admin 发表于2023-03-21 04:59:45 浏览33 评论0

抢沙发发表评论

本文目录

CreateWindow函数的第三个参数包含LBS_NOTIFY有什么作用LBS_SORT有什么作用LBS_MULTIPLESEL有什么作用

列表框风格说明LBS_STANDARD创建一个具有边界和垂直滚动条、当选择发生变化或条目被双击时能够通知父窗口的标准列表框。所有条目按字母排序。LBS_SORT按字母排序。LBS_NOSEL条目可视但不可选。LBS_NOTIFY当用户选择或双击一个串时,发出消息通知父窗口。LBS_DISABLENOSCROLL在条目不多时依然显示并不起作用的滚动条。LBS_MULTIPLESEL允许条目多选。LBS_EXTENDEDSEL可用SHIFT和鼠标或指定键组合来选择多个条目。LBS_MULTICOLUMN允许多列显示。LBS_OWNERDRAWVARIABLE创建一个拥有者画列表框,条目高度可以不同。LBS_OWNERDRAWFIXED创建一个具有相同条目高度的拥有者画列表框。LBS_USETABSTOPS允许使用TAB制表符。LBS_NOREDRAW当条目被增删后不自动更新列表显示。LBS_HASSTRINGS记忆了添加到列表中的字串。LBS_WANTKEYBOARDINPUT当有键按下时向父窗口发送WM_VKEYTOITEM或WM_CHARTOITEM消息。LBS_NOINTEGRALHEIGHT按程序设定尺寸创建列表框。

请问这段代码哪里有错啊为什么CreateWindow总是返回NULL啊

LRESULT CALLBACK MessageProcessFunction(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam); 这是你的消息处理函数,你只是定义,但并没有写它的具体消息处理动作。 例如:LRESULT CALLBACK MessageProcessFunction(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch(uMsg) case wm_paint: case wm_close } 并且WINMAIN函数里面也没有消息传递过程: 你要加上 MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } 意思是将消息传递到你的消息处理函数里面去

关于VC++ Createwindow的用法

CreateWindow是Windows API的宏,在WinUser.h中根据是否已定义Unicode被分别定义为CreateWindowW和CreateWindowA,然后两者又被分别定义为对CreateWindowExW和CreateWindowExA函数的调用。
函数原型
HWND CreateWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HANDLE hlnstance,
LPVOID lpParam);
参数说明
lpClassName:
指向一个空结束的字符串或整型数atom。如果该参数是一个整型量,它是由此前调用theGlobalAddAtom函数产生的全局量。这个小于0xC000的16位数必须是lpClassName参数字的低16位,该参数的高位必须是0。
如果lpClassName是一个字符串,它指定了窗口的类名。这个类名可以是任何用函数RegisterClass注册的类名,或是任何预定义的控制类名。请看说明部分的列表。
LPWindowName:
指向一个指定窗口名的空结束的字符串指针。
如果窗口风格指定了标题条,由lpWindowName指向的窗口标题将显示在标题条上。当使用Createwindow函数来创建控制例如按钮,选择框和静态控制时,可使用lpWindowName来指定控制文本。
dwStyle:
指定创建窗口的风格。该参数可以是下列窗口风格的组合再加上说明部分的控制风格。风格意义:
WS_BORDER:创建一个带边框的窗口。
WS_CAPTION:创建一个有标题框的窗口(包括WS_BORDER风格)。
WS_CHILD:创建一个子窗口。这个风格不能与WS_POPUP风格合用。
WS_CHILDWINDOW:与WS_CHILD相同。
WS_CLIPCHILDREN:当在父窗口内绘图时,排除子窗口区域。在创建父窗口时使用这个风格。
WS_CLIPSIBLINGS:排除子窗口之间的相对区域,也就是,当一个特定的窗口接收到WM_PAINT消息时,WS_CLIPSIBLINGS 风格将所有层叠窗口排除在绘图之外,只重绘指定的子窗口。如果未指定WS_CLIPSIBLINGS风格,并且子窗口是层叠的,则在重绘子窗口的客户区时,就会重绘邻近的子窗口。
WS_DISABLED:创建一个初始状态为禁止的子窗口。一个禁止状态的窗口不能接受来自用户的输入信息。
WS_DLGFRAME:创建一个带对话框边框风格的窗口。这种风格的窗口不能带标题条。
WS_GROUP:指定一组控制的第一个控制。这个控制组由第一个控制和随后定义的控制组成,自第二个控制开始每个
控制,具有WS_GROUP风格,每个组的第一个控制带有WS_TABSTOP风格,从而使用户可以在组间移动。用户随后可以使用光标在组内的控制间改变
键盘焦点。
WS_HSCROLL:创建一个有水平滚动条的窗口。
WS_ICONIC:创建一个初始状态为最小化状态的窗口。与WS_MINIMIZE风格相同。
WS_MAXIMIZE:创建一个初始状态为最大化状态的窗口。
WS_MAXIMIZEBOX:创建一个具有最大化按钮的窗口。该风格不能与WS_EX_CONTEXTHELP风格同时出现,同时必须指定WS_SYSMENU风格。
WS_OVERLAPPED:产生一个层叠的窗口。一个层叠的窗口有一个标题条和一个边框。与WS_TILED风格相同。
WS_OVERLAPPEDWINDOW:创建一个具有
WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU
WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX风格的层叠窗口,与WS_TILEDWINDOW风格相同。
WS_POPUP:创建一个弹出式窗口。该风格不能与WS_CHILD风格同时使用。
WS_POPUPWINDOW:创建一个具有WS_BORDER,WS_POPUP,WS_SYSMENU风格的窗口,WS_CAPTION和WS_POPUPWINDOW必须同时设定才能使窗口某单可见。
WS_SIZEBOX:创建一个可调边框的窗口,与WS_THICKFRAME风格相同。
WS_SYSMENU:创建一个在标题条上带有窗口菜单的窗口,必须同时设定WS_CAPTION风格。
WS_TABSTOP:创建一个控制,这个控制在用户按下Tab键时可以获得键盘焦点。按下Tab键后使键盘焦点转移到下一具有WS_TABSTOP风格的控制。
WS_THICKFRAME:创建一个具有可调边框的窗口,与WS_SIZEBOX风格相同。
WS_TILED:产生一个层叠的窗口。一个层叠的窗口有一个标题和一个边框。与WS_OVERLAPPED风格相同。
WS_TILEDWINDOW:创建一个具有
WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU,
WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX风格的层叠窗口。与WS_OVERLAPPEDWINDOW风
格相同。
WS_VISIBLE:创建一个初始状态为可见的窗口。
WS_VSCROLL:创建一个有垂直滚动条的窗口。
X:
指定窗口的初始水平位置。对一个层叠或弹出式窗口,X参数是屏幕坐标系的窗口的左上角的初始X坐标。对于子窗口,x
是子窗口左上角相对父窗口客户区左上角的初始X坐标。如果该参数被设为CW_USEDEFAULT则系统为窗口选择缺省的左上角坐标并忽略Y参数。
CW_USEDEFAULT只对层叠窗口有效,如果为弹出式窗口或子窗口设定,则X和y参数被设为零。
Y:
指定窗口的初始垂直位置。对一个层叠或弹出式窗口,y参数是屏幕坐标系的窗口的左上角的初始y坐标。对于子窗口,y
是子窗口左上角相对父窗口客户区左上角的初始y坐标。对于列表框,y是列表框客户区左上角相对父窗口客户区左上角的初始y坐标。如果层叠窗口是使用
WS_VISIBLE风格位创建的并且X参数被设为CW_USEDEFAULT,则系统将忽略y参数。
nWidth:
以设备单元指明窗口的宽度。对于层叠窗口,nWidth或是屏幕坐标的窗口宽度或是CW_USEDEFAULT。若
nWidth是CW_USEDEFAULT,则系统为窗口选择一个缺省的高度和宽度:缺省宽度为从初始X坐标开始到屏幕的右边界,缺省高度为从初始Y坐标
开始到目标区域的顶部。CW_USEDEFAULT只对层叠窗口有效;如果为弹出式窗口和子窗口设定CW_USEDEFAULT标志则nWidth和
nHeight被设为零。
nHeight:
以设备单元指明窗口的高度。对于层叠窗口,nHeight是屏幕坐标的窗口宽度。若nWidth被设为CW_USEDEFAULT,则系统忽略nHeight参数。
hWndParent:
指向被创建窗口的父窗口或所有者窗口的句柄。若要创建一个子窗口或一个被属窗口,需提供一个有效的窗口句柄。这个参数对弹出式窗口是可选的。Windows NT 5.0;创建一个消息窗口,可以提供HWND_MESSAGE或提供一个己存在的消息窗口的句柄。
hMenu:
菜单句柄,或依据窗口风格指明一个子窗口标识。对于层叠或弹出式窗口,hMenu指定窗口使用的菜单:如果使用了菜单类,则hMenu可以为NULL。对于子窗口,hMenu指定了该子窗口标识(一个整型量),一个对话框使用这个整型值将事件通知父类。应用程序确定子窗口标识,这个值对于相同父窗口的所有子窗口必须是唯一的。
hlnstance:
与窗口相关联的模块实例的句柄。
lpParam:
指向一个值的指针,该值传递给窗口WM_CREATE消息。该值通过在IParam参数中的CREATESTRUCT结构传递。如果应用程序调用CreateWindow创建一个MDI客户窗口,则lpParam必须指向一个CLIENTCREATESTRUCT结构。
返回值:如果函数成功,返回值为新窗口的句柄:如果函数失败,返回值为NULL。若想获得更多错误信息,请调用GetLastError函数。
备注
在返回前,CreateWindow给窗口过程发送一个WM_CREATE消息。对于层叠,弹出式和子窗
口,CreateWindow给窗口发送WM_CREATE,WM_GETMINMAXINFO和WM_NCCREATE消息。消息WM_CREATE的
IParam参数包含一个指向CREATESTRUCT结构的指针。如果指定了WS_VISIBLE风格,CreateWindow向窗口发送所有需要激活和显示窗口的消息。

在MFC中创建单文档程序时,为什么不用CreateWindow而用CreateEx,CreateEx是CreateWindow的一个宏吗拜

HWND CreateWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam ); HWND CreateWindowEx( DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam ); 多了一个设置扩展样式(WS_EX_* 的宏)的参数:DWORD dwExStyle.可以设置窗口的扩展样式.其他参数都一样.

请问CreateWindow创建的窗口怎样才能在关闭后立刻Set m_wcMyWin=Nothing销毁它的类实例呢

我觉得你这么写不对吧?
WM_DESTROY过程中你调用QueryDestroy,然后就把这个对象设置成nothing了,但是这个对象还“正在删除过程中”你就直接把它撤销了,这样不行,set nothing的动作应该在对象完全close以后才可以做,不可以在close的过程中做你把setnothing去掉就可以了,如果你怕删不掉的话,那么你不去处理WM_DESTROY,让系统自己去处理也可以删除窗口
==============
这个貌似没有什么方法吧,不过从数据库对象的创建和删除过程中可以看到的就是显示执行了close操作,然后再set nothing。
你看看你的类里能不能提供一个close方法,然后再set nothing即可我觉得你的set nothing只要写在类的外面就可以了,写在引用它的地方,如果是全局结构的话我觉得你不set nothing可能也是没有问题的

用CreateWindow创建的edit怎么改变背景色

动态更改Edit控件的文本颜色:
映射WM_CTLCOLOR函数
HBRUSH CYourDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (pWnd-》GetDlgCtrlID() == IDC_EDIT1)
{
// Set the text color
pDC-》SetTextColor(RGB(0,0,255));
}
return hbr;
}
Edit控件属性里把Multiline和Want Return两项都选成True就能换行了.
自动换行与自动滚屏的方法:
方法一:(当EDIT映射到一CString时)
m_String = m_String + sNewString + “\r\n“ //自动换行
UpdateData(false);
此法只能做到自动换行,不会自动滚屏到最后一行。
方法二:(当EDIT映射到一EDIT时)
m_Edit.SetSel(-1, -1); //自动滚屏
m_Edit.ReplaceSel(sNewString+“\r\n“); //自动换行
UpdateData(true);
此法可以做到自动换行,并自动滚屏到最后一行。
以上,m_String、m_Edit.分别为给编辑框添加的成员变量;sNewString 为要显示的字符串
注意二法中UpdataData参数的区别。
我发现修改编辑框的属性:Auto_HScroll等用处不大。
方法三:
打开Vertical scroll和Auto VScroll,关掉Horizontal scroll和 Auto HScroll
Sorry,我就学了MFC...帮不了你

CreateWindowEx和CreateWindow的区别

CreateWindowEx是后者的扩展版,需要提供更多的参数,可以得到更大的控制。
Ex就是Extend的意思,这在Windows API中很常见,你以后会经常见到。

用WINDOWS API的CreateWindow创建的窗口如何添加控件

给你一个例子吧,把一下代码放到一个win32工程里运行。
/*
//---------------------------------------------------------------------------
#include 《windows.h》
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
return 0;
}
//---------------------------------------------------------------------------
*/
#include 《windows.h》
//#include 《alloc.h》
#include 《malloc.h》
//IDENTIFIERS
#define IDC_CHECKBOX1 100 ///《Identifier For 1st Check Box
#define IDC_CHECKBOX2 101 ///《Identifier For 2nd Check Box
#define IDC_CHECKBOX3 102 ///《Identifier For 3rd Check Box
#define IDC_CHECKBOX4 103 ///《Identifier For 4th Check Box
#define IDC_RADIO11 104 ///《Identifier For 1st Radio Button
#define IDC_RADIO12 105 ///《Identifier For 2nd Radio Button
#define IDC_RADIO13 106 ///《Identifier For 3rd Radio Button
#define IDC_RADIO21 107 ///《Identifier For 1st Radio Button
#define IDC_RADIO22 108 ///《Identifier For 2nd Radio Button
#define IDC_RADIO23 109 ///《Identifier For 3rd Radio Button
#define IDC_EDITBOX 110 ///《Identifier For Edit Control
#define IDC_LISTBOX 111 ///《Identifier For List Box
#define IDC_SUBMIT 112 ///《Identifier For Submit Button
#define IDC_GROUP1 113 ///《Identifier For 1st Group
#define IDC_GROUP2 114 ///《Identifier For 2nd Group
#define IDC_GROUP3 115 ///《Identifier For 3rd Group
#define IDC_RESET 116 ///《Identifier For Reset Button
#define IDC_COMBOBOX 117 ///《Identifier For Reset Button
#define ONE 1 ///《Macro Declaration.
#define TWO 2 ///《Macro Declaration.
#define THREE 3 ///《Macro Declaration.
#define FOUR 4 ///《Macro Declaration.
#define ZERO 0 ///《Macro Declaration.
#define FIVE 5 ///《Macro Declaration.
//Global Variables
HANDLE ghInstance; ///《 Contains the instance of the Application
int gCheckonce=ONE,i; ///《used for the submit button to allow only one submission.
LRESULT CALLBACK WindowProc( HWND phWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
void CreateLabels(HWND phWnd);
void CreateGroups(HWND phWnd);
void CreateLabels(HWND phWnd);
void CreateListBox(HWND phWnd);
void CreateEditBox(HWND phWnd);
void CreateComboBox(HWND phWnd);
void Createopbutton(HWND phWnd);
void CreateControls( HWND phWnd );
void CreateCheckBox(HWND phWnd,int y_axis);
void CreateRadioButtonsecondgroup(HWND hWnd,int y_axis);
void CreateRadioButtonfirstgroup(HWND phWnd,int y_axis);
void EditText(HWND phWnd);
void AddItemsInListBox(HWND phWnd);
void RetrieveTextFromComboBox(HWND phWnd);
void radiocheck(int pButton_no,HWND phWnd);
void checkbox(HWND phwndCheckBox , HWND phWnd);
char* RetrieveText(HWND hWnd);
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow )
{
WNDCLASS wc; ///《contains the window class attributes that are registered by the RegisterClass
function
MSG msg; ///《structure contains message information from a thread’s message queue
HWND hWnd; ///《handle to window
BOOL bRet;
LoadLibrary(“riched32.dll“);
if( !hPrevInstance ){
wc.lpszClassName = “GenericAppClass“; ///《Name to identify the window class.
wc.lpfnWndProc = WindowProc; ///《Pointer to the window procedure for this window class
wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW; ///《Specifies the class style(s)
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ); ///《returns the handle to an icon to be loaded on the
window
wc.hCursor = LoadCursor( NULL, IDC_ARROW ); ///《returns the handle to the cursor that has to be
displayed
wc.hbrBackground = (HBRUSH)( COLOR_WINDOW+11); ///《set the background color
wc.lpszMenuName = NULL; ///《class have no default menu
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
RegisterClass( &wc ); ///《this will register the class
}
ghInstance = hInstance;
//CreateWindow will return the handle to a new window
hWnd = CreateWindow( “GenericAppClass“, ///《name of the window class
“EXAMPLE OF TAB CONTROL“, ///《window name
WS_OVERLAPPEDWINDOW|WS_HSCROLL|
WS_VSCROLL|WS_CLIPSIBLINGS, ///《specifies the window style
0, ///《set the horizontal position of the window
0, ///《set the vertical position of the window
CW_USEDEFAULT, ///《set the width of the window
CW_USEDEFAULT, ///《set the height of the window
NULL, ///《contains valid pointer for child window
NULL, ///《class menu is used
hInstance, ///《Handle to the instance associated with the window
NULL );
//function to show the window
ShowWindow( hWnd, SW_MAXIMIZE );
//it will be executed if function will return nonzero value
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0 )
{
//execute if there is an error otherwise ’else’ part is executed
if (bRet == -1) {

return 0;

} else {

TranslateMessage( &msg ); ///《translates virtual-key messages into character messages.
DispatchMessage( &msg ); ///《dispatches a message to a window procedure
}
} ///《loops ended
return (int)msg.wParam; ///《 returns integer that indicates the additional information of the msg
} // End of WinMain()
LRESULT CALLBACK WindowProc( HWND phWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch( uMsg ){
//call function to create all controls.
case WM_CREATE:
CreateControls(phWnd); ///《creates all the controls.
break;

//used to close the window
case WM_CLOSE:
if((MessageBox(phWnd, “DO YOU REALLY WANT TO EXIT ?“, “Message“,MB_OKCANCEL))==IDOK){
//for final exit
DestroyWindow(phWnd); ///《 POSTS THE MESSAGE WM_DESTROY TO DESTROY THE CREATED WINDOW.
}
break;
case WM_COMMAND:
//Handling Window Controllers
switch(LOWORD(wParam)){
case IDC_SUBMIT:
///《handles the submission of the details into the list box on clicking submit
if(HIWORD(wParam)==BN_CLICKED && gCheckonce==ONE){ ///《 hiword(wParam) takes the notification
AddItemsInListBox(phWnd); ///《displays all the details in the list box.
gCheckonce=TWO;
}
break;
case IDC_RESET:
if(HIWORD(wParam)==BN_CLICKED){
for(i=ZERO; i《FOUR; i++){
//sends message to uncheck the radio buttons of the first group.
SendMessage(GetDlgItem(phWnd,(IDC_RADIO11+i)),BM_SETCHECK,BST_UNCHECKED,0);
//sends message to uncheck the radio buttons of the second group
SendMessage(GetDlgItem(phWnd,(IDC_RADIO21+i)),BM_SETCHECK,BST_UNCHECKED,0);
//sends message to uncheck the check boxes.
SendMessage(GetDlgItem(phWnd,(IDC_CHECKBOX1+i)),BM_SETCHECK,BST_UNCHECKED,0);
}
//sends message to reset the edit box.
SendMessage(GetDlgItem(phWnd,IDC_EDITBOX),WM_SETTEXT,0,(LPARAM)“ “);
//sends message to reset the combo box.
SendMessage(GetDlgItem(phWnd,IDC_COMBOBOX),CB_SETCURSEL,0,(LPARAM)““);
//sends message to reset the list box.
SendMessage(GetDlgItem(phWnd,IDC_LISTBOX),LB_RESETCONTENT,0,0);
//resets the flag of the submit button to 1.
gCheckonce=ONE;
}
break;
}
break;
//USED TO CONTROL WINDOW
case WM_DESTROY:
PostQuitMessage(0); ///《 posts the message wm_quit to quit the window.
break;
//TO PROVIDE DEFAULT PROCESSING ON ANY WINDOW MESSAGES
default:
return( DefWindowProc( phWnd, uMsg, wParam, lParam ));
}
return 0;
}
void CreateLabels(HWND phWnd)
{
//LABEL FOR THE COMBO BOX
CreateWindow(“Static“,“Enter the field of
Study:“,WS_CHILD|WS_VISIBLE|SS_LEFT,40,80,200,20,phWnd,NULL,ghInstance,NULL);
//LABEL FOR THE BADIOBUTTONS OF FIRST GROUP
CreateWindow(“Static“,“Enter the Students Year Of Study:“,WS_CHILD|WS_VISIBLE|SS_LEFT,40,160,250
,20,phWnd,NULL,ghInstance,NULL);
//LABEL FOR THE EDIT BOX
CreateWindow(“Static“,“Enter the Students Name:“,WS_CHILD|WS_VISIBLE|SS_LEFT,510,80,180,20,
phWnd,NULL,ghInstance,NULL);
//LABEL FOR THE RADIOBUTTONS OF THE SECOND GROUP
CreateWindow(“Static“,“Enter the Students Initials:“,WS_CHILD|WS_VISIBLE|SS_LEFT,510,160,180,20,
phWnd,NULL,ghInstance,NULL);

//LABEL FOR THE CHECK BOX
CreateWindow(“Static“,“Enter the Students Hobbies:“,WS_CHILD|WS_VISIBLE|SS_LEFT,220,350,280,20,
phWnd,NULL,ghInstance,NULL);
}
void CreateControls( HWND phWnd )
{
//TO CREATE COMBO BOX
CreateComboBox(phWnd);
//TO CREATE RADIOBUTTON
CreateRadioButtonfirstgroup(phWnd,180);
//TO CREATE LABELS FOR ALL THE CONTROLS
CreateLabels(phWnd);
//TO CREATE THE GROUP STRUCTURE
CreateGroups(phWnd);

// CreateEditBox(phWnd);
CreateEditBox(phWnd);
//TO CREATE SECOND SET OF RADIOBUTTONS
CreateRadioButtonsecondgroup(phWnd,180);
//TO CREATE CHECK BOX
CreateCheckBox(phWnd,340);
//TO CREATE THE SUBMIT AND RESET BUTTONS FOR THE 1ST TAB
Createopbutton(phWnd);

//TO CREATE LIST BOX CONTROL
CreateListBox(phWnd);
//used to setfocus on ComboBox
SetFocus(GetDlgItem(phWnd,IDC_COMBOBOX));
}
void CreateGroups(HWND phWnd)
{
//CREATES THE OUTLINE FOR THE FIRST GROUP
CreateWindow(“Button“, “SUBJECT DETAILS“ , WS_CHILD | WS_VISIBLE |BS_GROUPBOX,30,50,400,250,phWnd,
(HMENU)IDC_GROUP1,ghInstance,NULL);
//CREATES THE OUTLINE FOR THE SECOND GROUP
CreateWindow(“Button“, “STUDENT DETAILS“ , WS_CHILD | WS_VISIBLE |BS_GROUPBOX,500,50,400,
250,phWnd,(HMENU)IDC_GROUP2,ghInstance,NULL);
//CREATES THE OUTLINE FOR THE THIRD GROUP
CreateWindow(“Button“, “HOBBIES“ , WS_CHILD | WS_VISIBLE |BS_GROUPBOX,30,320,670,
120,phWnd,(HMENU)IDC_GROUP3,ghInstance,NULL);
}
void CreateRadioButtonfirstgroup(HWND phWnd,int y_axis)
{
int i,x_axis;
char *radiobuttonnames={“I“,“II“,“III“};
//this loop creates the three radiobuttons.
for(i=ZERO,x_axis=50;i《THREE;i++,x_axis+=90){
CreateWindow(“Button“,radiobuttonnames[i],WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTORADIOBUTTON ,
x_axis,y_axis,50,100,phWnd,(HMENU)(IDC_RADIO11+i), ghInstance,NULL);
}
}
void CreateRadioButtonsecondgroup(HWND hWnd,int y_axis)
{
int i,x_axis;
char *radiobuttonnames1={“Mr“,“Miss“,“Mrs“};
//this loop creates the three radiobuttons.
for(i=ZERO,x_axis=520;i《THREE;i++,x_axis+=90){
CreateWindow(“Button“,radiobuttonnames1[i],WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTORADIOBUTTON,
x_axis,y_axis,50,100,hWnd,(HMENU)(IDC_RADIO21+i),ghInstance,NULL);
}
}
void Createopbutton(HWND phWnd)
{
//CREATES THE SUBMIT BUTTON
CreateWindow(“Button“,“Submit“,WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON|WS_TABSTOP ,350,600,100,30,
phWnd,(HMENU)IDC_SUBMIT,ghInstance,NULL);
//CREATES THE RESET BUTTON
CreateWindow(“Button“,“Reset“,WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON|WS_TABSTOP ,550,600,100,30,
phWnd,(HMENU)IDC_RESET,ghInstance,NULL);
}
void CreateCheckBox(HWND phWnd,int y_axis)
{
int x_axis,i;
char *checkboxnames={“Singing“,“Dancing“,“Sketching“,“Drawing“};
//this loop creates the four checkboxes.
for(i=ZERO,x_axis=50;i《FOUR;i++,x_axis+=150){
CreateWindow(“Button“,checkboxnames[i],WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX|WS_TABSTOP,
x_axis,390,100,15,phWnd,(HMENU)(IDC_CHECKBOX1+i),ghInstance,NULL);
}
}
void CreateComboBox(HWND phWnd)
{

char *comboitem = { “SELECT“,
“MATHS“,
“BIOLOGY“,
“COMMERCE“,
“ARTS“ };
int i;
CreateWindow( “COMBOBOX“,
““,
CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE |WS_TABSTOP|WS_GROUP,
70,
100,
200,
500,
phWnd,
(HMENU) IDC_COMBOBOX,
ghInstance,
NULL);
//Add items in the Combo Box
for(i=ZERO;i《FIVE;i++)
SendMessage(GetDlgItem(phWnd,IDC_COMBOBOX), CB_ADDSTRING, 0, (LPARAM) comboitem[i]);
}
void CreateEditBox(HWND phWnd)
{
//CREATES THE EDIT BOX
CreateWindow(“Edit“,NULL,WS_CHILD|WS_VISIBLE |WS_BORDER|WS_GROUP|WS_TABSTOP,700,70,180,40,
phWnd,(HMENU)IDC_EDITBOX, ghInstance,NULL);
}
void CreateListBox(HWND phWnd)
{
//CREATES THE LIST BOX
CreateWindow(“ListBox“,NULL,WS_CHILD|WS_VISIBLE |WS_BORDER |WS_VSCROLL,200,480,200,50,phWnd,(HMENU)
IDC_LISTBOX,ghInstance,NULL);
}
void AddItemsInListBox(HWND phWnd)
{
//CALL FUNCTION TO RETRIEVE THE SELECTED STRING FROM THE COMBO BOX
RetrieveTextFromComboBox(phWnd);
//CALL FUNCTION TO CHECK THAT WEATHER THE CHECK BOX 1 SELECTD OR N0T
checkbox(GetDlgItem(phWnd,IDC_CHECKBOX1),phWnd);
//CALL FUNCTION TO CHECK THAT WEATHER THE CHECK BOX 2 IS SELECTD OR N0T
checkbox(GetDlgItem(phWnd,IDC_CHECKBOX2),phWnd);
//CALL FUNCTION TO CHECK THAT WEATHER THE CHECK BOX 3 IS SELECTD OR N0T
checkbox(GetDlgItem(phWnd,IDC_CHECKBOX3),phWnd);
//CALL FUNCTION TO CHECK THAT WEATHER THE CHECK BOX 3 IS SELECTD OR N0T
checkbox(GetDlgItem(phWnd,IDC_CHECKBOX4),phWnd);

//CALL FUNCTION TO CHECK THAT WEATHER THE RADIO BUTTON 1 OF RADIO GROUP 1 IS SELECTD OR N0T
radiocheck(IDC_RADIO11,phWnd);

//CALL FUNCTION TO CHECK THAT WEATHER THE RADIO BUTTON 2 OF RADIO GROUP 1 IS SELECTD OR N0T
radiocheck(IDC_RADIO12,phWnd);

//CALL FUNCTION TO CHECK THAT WEATHER THE RADIO BUTTON 3 OF RADIO GROUP 1 IS SELECTD OR N0T
radiocheck(IDC_RADIO13,phWnd);

//CALL FUNCTION TO CHECK THAT WEATHER THE RADIO BUTTON 1 OF RADIO GROUP 2 IS SELECTD OR N0T
radiocheck(IDC_RADIO21,phWnd);

//CALL FUNCTION TO CHECK THAT WEATHER THE RADIO BUTTON 2 OF RADIO GROUP 2 IS SELECTD OR N0T
radiocheck(IDC_RADIO22,phWnd);

//CALL FUNCTION TO CHECK THAT WEATHER THE RADIO BUTTON 3 OF RADIO GROUP 2 IS SELECTD OR N0T
radiocheck(IDC_RADIO23,phWnd);

//CALL FUNCTION TO CHECK THAT WEATHER THE TEXT IS AVILABLE IN EDIT CONTROL OR N0T
EditText(phWnd);
}
void radiocheck(int pButton_no,HWND phWnd)
{

char* edittext;
int i;
//RETURN TRUE IF RADIO BUTTON IS SELECTED
if(SendMessage( GetDlgItem(phWnd,pButton_no),BM_GETCHECK,0,0) == BST_CHECKED) {

//Retrieve the length of the text associated with the CheckBox
i = GetWindowTextLength( GetDlgItem(phWnd,pButton_no));

//Allocate memory of i length
edittext = (char*)calloc(10,(i+1)*sizeof(char));

//Retrieve the string associated with the Radio Buttons
GetWindowText( GetDlgItem(phWnd,pButton_no), edittext,i+1);

//Add that string in to the List box
SendMessage(GetDlgItem(phWnd,IDC_LISTBOX),LB_ADDSTRING,0, (LPARAM)edittext);
free(edittext);
}
}
void EditText(HWND phWnd)
{

char *edittext; ///《contains the address of the Buffer

//call RetrieveText() to retrieve text from the Edit Control of First Group Box
edittext=RetrieveText( GetDlgItem(phWnd,IDC_EDITBOX));
//add that string in the List box
SendMessage(GetDlgItem(phWnd,IDC_LISTBOX),LB_ADDSTRING,0,(LPARAM) edittext);
free(edittext);
}
void RetrieveTextFromComboBox(HWND phWnd)
{

char *edittext;
int CBIndex;
(LRESULT) CBIndex = SendMessage(GetDlgItem(phWnd,IDC_COMBOBOX),CB_GETCURSEL,0,0);

//checks whether or not any value is selected in the combo box if not retuns -1
if (CBIndex != -1) {

edittext=RetrieveText( GetDlgItem(phWnd,IDC_COMBOBOX));
//ADD THE RETRIEVED TEXT TO THE LIST BOX
SendMessage( GetDlgItem(phWnd,IDC_LISTBOX),LB_ADDSTRING,0,(LPARAM) edittext);

free(edittext);
}
}
char* RetrieveText(HWND hWnd)
{
char *edittext;
int textlength;
//Retrieve text length
(LRESULT)textlength = SendMessage( hWnd,WM_GETTEXTLENGTH,0,0);
edittext=(char*)calloc(textlength+1,sizeof(char));

//retrieve the string entered in the Edit Control
SendMessage( hWnd,WM_GETTEXT,textlength+1,(LPARAM) edittext);
return edittext;
}
void checkbox(HWND phwndCheckBox , HWND phWnd)
{

char * edittext;
int i;
//RETURN TRUE IF CHECK BOX IS SELECTED
if(SendMessage(phwndCheckBox,BM_GETCHECK,0,0)==BST_CHECKED) {

//retrieve the length of the text associated with the CheckBox
i = GetWindowTextLength(phwndCheckBox);

//Allocate memory of i length
edittext = (char*)calloc(10,(i+1)*sizeof(char));

//retrieve the string associated with the CheckBox
i = GetWindowText( phwndCheckBox, edittext,(i+1) );

//add that string in to the List box
SendMessage(GetDlgItem( phWnd, IDC_LISTBOX ),LB_ADDSTRING,0,(LPARAM) edittext);

free(edittext);
}
}

API中怎么用CreateWindowEx创建一个窗体或控件

函数功能:该函数创建一个具有扩展风格的层叠式窗口、弹出式窗口或子窗口,其他与CreateWindow函数相同。函数原型:CreateWindowEx函数创建一个层叠的,自动弹出的(pop-up)或是一个子窗口通过扩展格式。另外这个函数的作用与CreateWindow函数的作用相同。要获得更多的关于创建窗口的信息和关于CreateWindowEx函数参数的详细描述。参见CreateWindowHWND CreateWindowEx(DWOR DdwExStyle, //窗口的扩展风格LPCTSTR lpClassName, //指向注册类名的指针LPCTSTR lpWindowName, //指向窗口名称的指针DWORD dwStyle, //窗口风格int x, //窗口的水平位置int y, //窗口的垂直位置int nWidth, //窗口的宽度int nHeight, //窗口的高度HWND hWndParent, //父窗口的句柄HMENU hMenu, //菜单的句柄或是子窗口的标识符HINSTANCE hInstance, //应用程序实例的句柄LPVOID lpParam //指向窗口的创建数据);

win32k.sys新曝出的CVE-2019-0859零日漏洞,是怎么一回事

卡巴斯基实验室在安全公告中称,其安全研究人员在 win32k.sys 中又发现了一个新的零日漏洞,代号为 CVE-2019-0859 。

2019 年 3 月,卡巴斯基的自动化漏洞利用防护(EP)系统检测到了对微软 Windows 操作系统中的漏洞尝试。

但在进一步分析后,他们发现 win32k.sys 中确实存在新的零日漏洞,而且这是实验室最近几月内第五次发现被利用的本地提权漏洞。

【Win7 SP1 x64 上的 win32k!xxxFreeWindow+0x1344 弹窗,图自:Kaspersky Lab】

2019 年 3 月 17 日,卡巴斯基实验室向微软提交了漏洞报告,该公司确认了该漏洞,并分配了 CVE-2019-0859 这个编号。

万幸的是,微软已经为该漏洞发布了一个补丁,并通过 Windows Update 进行了推送。

卡巴斯基实验室称,功劳簿上有 Vasiliy Berdnikov 和 Boris Larin 这两位安全研究人员的名字。

至于 CVE-2019-0859 漏洞的技术细节,主要是 CreateWindowEx 函数中隐含的 Use-After-Free 漏洞。

执行期间,CreateWindowEx 会在首次创建时,将 WM_NCCREATE 消息发送到窗口。

借助 SetWindowsHookEx 函数,可在窗口调用过程之前,设置处理 WM_NCCREATE 消息的自定义回调。

然而在 win32k.sys 中,所有窗口都由 tagWND 结构呈现,其具有“fnid”字段(亦称 Function ID)。

该字段用于定义窗口的类,所有窗口分为 ScrollBar、Menu、Desktop 等部分,此前卡巴斯基已经分享过与我们已经写过与 Function ID 相关的 bug 。

在 WM_NCCREATE 回调期间,窗口的 Function ID 被设置为 0,使得我们能够钩子内部为窗口设置额外数据,更重要的是 Hook 后立即执行的窗口过程的地址。

将窗口过程更改为菜单窗口过程,会导致执行 xxxMenuWindowProc,且该函数会将 Function ID 启动到 FNID_MENU(因为当前消息等于 WM_NCCREATE)。

在将 Function ID 设置为 FNID_MENU 之前操作额外数据的能力,可强制 xxxMenuWindowProc 函数停止菜单的初始化、并返回 FALSE 。

因此发送 NCCREATE 消息将被视为失败的操作,CreateWindowEx 函数将通过调用 FreeWindow 来停止执行。

卡巴斯基实验室发现,野外已经有针对 64-bit 版本的 Windows 操作系统的攻击(从 Windows 7 到 Windows 10),其利用了众所周知的 HMValidateHandle 漏洞来绕过 ASLR 。

成功利用后,漏洞会借助 Base64 编码命令来执行 PowerShell,主要目的是从