在主函数LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 下添加代码:
static HWND hwndButton[NUM] ;
static RECT rect ;
static TCHAR szTop[] = TEXT ("message wParam lParam"),
szUnd[] = TEXT ("_______ ______ ______"),
szFormat[] = TEXT ("%-16s%04X-%04X %04X-%04X"),
szBuffer[50] ;
static int cxChar, cyChar ;
// HDC hdc ;
// PAINTSTRUCT ps ;
int i ;
switch (wMsg)
{
case WM_CREATE:
temp_Item = B_Mode_Item_en;
cxChar = LOWORD (GetDialogBaseUnits ()) ;
cyChar = HIWORD (GetDialogBaseUnits ()) ;
for (i = 0 ; i < NUM ; i++)
hwndButton[i] = CreateWindow ( CTRL_STATIC,
temp_Item[0],
WS_CHILD | WS_VISIBLE | button[i].iStyle,
cxChar, cyChar * (1 + 2 * i),
20 * cxChar, 7 * cyChar / 4,
hWnd, (HMENU) i,
((LPCREATESTRUCT) lParam)->hInstance, NULL) ;
SetWindowLong (hWnd, DWL_USER, (LONG)hwndButton[i]);
break;
} return TRUE;能够在客户区显示创建孔件!
但是在其他函数如或新建.CPP里添加创建函数(和以上相同的(MESSAGE)创建控件函数):BOOL CALLBACK BtnDlgProc (HWND hWnd, UINT wMsg, WPARAM wParam,
LPARAM lParam) 下创建如上控件却无法显示,是什么原因啊?
static HWND hwndButton[NUM] ;
static RECT rect ;
static TCHAR szTop[] = TEXT ("message wParam lParam"),
szUnd[] = TEXT ("_______ ______ ______"),
szFormat[] = TEXT ("%-16s%04X-%04X %04X-%04X"),
szBuffer[50] ;
static int cxChar, cyChar ;
// HDC hdc ;
// PAINTSTRUCT ps ;
int i ;
switch (wMsg)
{
case WM_CREATE:
temp_Item = B_Mode_Item_en;
cxChar = LOWORD (GetDialogBaseUnits ()) ;
cyChar = HIWORD (GetDialogBaseUnits ()) ;
for (i = 0 ; i < NUM ; i++)
hwndButton[i] = CreateWindow ( CTRL_STATIC,
temp_Item[0],
WS_CHILD | WS_VISIBLE | button[i].iStyle,
cxChar, cyChar * (1 + 2 * i),
20 * cxChar, 7 * cyChar / 4,
hWnd, (HMENU) i,
((LPCREATESTRUCT) lParam)->hInstance, NULL) ;
SetWindowLong (hWnd, DWL_USER, (LONG)hwndButton[i]);
break;
} return TRUE;能够在客户区显示创建孔件!
但是在其他函数如或新建.CPP里添加创建函数(和以上相同的(MESSAGE)创建控件函数):BOOL CALLBACK BtnDlgProc (HWND hWnd, UINT wMsg, WPARAM wParam,
LPARAM lParam) 下创建如上控件却无法显示,是什么原因啊?
CALLBACK BtnDlgProc (HWND hWnd, UINT wMsg, WPARAM wParam,
LPARAM lParam)
下面时候,没任何反映,但是在主函数LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 下添加上面代码,运行后变量是运行的,那些变量我都是添加在BtnDlgProc里的,应该运行的。
我要是在其他CPP中创建控件也要注册吗?
谢谢
如果主窗口的回调函数不是BtnDlgProc, 则BtnDlgProc中的代码根本不会运行.
我想你说的对,BtnDlgProc不是主窗口的回调函数,我要做的工程是比较大,要想在BtnDlgProc中调用创建函数创建控件,并且把她显示在客户区中,有没有办法??
在WndProc的WM_CREATE中,创建一个类名为"btnDlgClass"的子窗口hWndBtnDlg,
在WM_SIZE中SetWindowPos(hWndBtnDlg, hWnd, 0, 0, LOWORD(lParam), HIWORD(lParam), SWP_NOZORDER);
代码如下:int InitBtnDlg (HINSTANCE hInstance) {
WNDCLASS wcl; // Register application EditWnd window class.
wcl.style = 0; // Window style
wcl.lpfnWndProc = BtnDlgProc; // Callback function
wcl.cbClsExtra = 0; // Extra class data
wcl.cbWndExtra = 0; // Extra window data
wcl.hInstance = hInstance; // Owner handle
wcl.hIcon = NULL, // Application icon
wcl.hCursor = LoadCursor (NULL, IDC_ARROW);// Default cursor
wcl.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wcl.lpszMenuName = NULL; // Menu name
wcl.lpszClassName = CTRL_STATIC; // Window class name if (RegisterClass (&wcl) == 0) return 1; return 0;
}
BOOL CALLBACK BtnDlgProc (HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam) { static HWND hwndButton[NUM] ;
static RECT rect ;
static TCHAR szTop[] = TEXT ("message wParam lParam"),
szUnd[] = TEXT ("_______ ______ ______"),
szFormat[] = TEXT ("%-16s%04X-%04X %04X-%04X"),
szBuffer[50] ;
static int cxChar, cyChar ;
// HDC hdc ;
// PAINTSTRUCT ps ;
int i ;
switch (message)
{
case WM_CREATE:
temp_Item = B_Mode_Item_en;
cxChar = LOWORD (GetDialogBaseUnits ()) ;
cyChar = HIWORD (GetDialogBaseUnits ()) ;
for (i = 0 ; i < NUM ; i++)
hwndButton[i] = CreateWindow ( CTRL_STATIC,
temp_Item[0],
WS_CHILD | WS_VISIBLE | button[i].iStyle,
cxChar, cyChar * (1 + 2 * i),
20 * cxChar, 7 * cyChar / 4,
hWnd, (HMENU) i,
((LPCREATESTRUCT) lParam)->hInstance, NULL) ;
SetWindowLong (hWnd, DWL_USER, (LONG)hwndButton[i]);
break;
} return TRUE;
}
编译后报错:Compiling...
Menucreate.cpp
D:\Source\Project\Menucreate.cpp(1211) : error C2440: '=' : cannot convert from 'int (__cdecl *)(struct HWND__ *,unsigned int,unsigned int,long)' to 'long (__cdecl *)(struct HWND__ *,unsigned int,unsigned int,long)'
This conversion requires a reinterpret_cast, a C-style cast or function-style cast
Error executing cl.exe.Menucreate.obj - 1 error(s), 0 warning(s)
你的建议“你可以再注册一个窗口类 "btnDlgClass ", 将其回调函数指定为BtnDlgProc, 在WndProc的WM_CREATE中,创建一个类名为 "btnDlgClass "的子窗口hWndBtnDlg,
在WM_SIZE中SetWindowPos(hWndBtnDlg, hWnd, 0, 0, LOWORD(lParam), HIWORD(lParam), SWP_NOZORDER); ”我想在BtnDlgProc中的WM_CREATE中创建子窗口不可以吗?WM_SIZE中SetWindowPos 也在BtnDlgProc里的可以吗?
ttnDlgClass可以作为框架窗口的子窗口, 只处理和它相关的操作.
ttnDlgClass中也可创建多个子窗口, 对具体的功能加以细化和分工.
我的意思是,能不能直接在其他回调函数,比如LRESULT CALLBACK BtnDlgProc 直接创建控件窗口,并在主框架(WndProc)客户区显示?LRESULT CALLBACK BtnDlgProc 这个回调函数在其他CPP中新加的,我是新接触的,不好意思。我用过别人的代码可以成功,但我不能够显示出来
在stdafx.h中声明extern HWND g_hFrame;假设btnDlgClass窗口已创建(必须创建,但不一定显示出来, 否则BtnDlgProc不会执行),如果在BtnDlgProc的WM_CREATE中创建控件时将CreateWindow中的hwndParent参数指定为g_hFrame, 则该控件可以在主框架窗口的客户区显示.
形式是这样吗:HWND hWndBtnDlg
WNDCLASS btnDlgClass;
hWndBtnDlg=CreateWindow{ }还要加其他语句吗 我这样做了没显示真不好意思麻烦你
我把你的程序 基本全部考到我程序里都不能成功运行。
我用的不是VC6
我是在WINCE下 EVC4.0编译的
在WINCE中没 WM_NCCREATE
我把源程序发给你看下!