![]() |
#2
lonmaor2013-06-05 13:08
我把所有的malloc/free改成new/delete就没问题了。很好奇为什么要定义那么多静态变量?
![]() // winapp1.cpp : Defines the entry point for the application. // #include "stdafx.h" #include <Windows.h> #define IDC_STATIC 1 #define IDC_LISTBOX 2 LRESULT CALLBACK wndprog(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) { TCHAR szappname[] = TEXT("mywindow"); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW|CS_VREDRAW; wndclass.lpfnWndProc = wndprog; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szappname; if ( !RegisterClass(&wndclass)) { MessageBox(NULL,"create window failed!",szappname,MB_ICONERROR); return 0 ; } hwnd = CreateWindow(szappname,TEXT("This is my window !"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hwnd,nShowCmd); UpdateWindow(hwnd); while( GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK wndprog(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam) { static HWND hlistbox, hstatic; static int xclinet, yclient; static int xchar, ychar; static TCHAR *strings; static TCHAR *szbuffer = NULL,*temp = NULL,*save = NULL; int index, length,priorlength=0; switch (message) { case WM_CREATE: { hstatic = CreateWindow(TEXT("static"),TEXT("nothing"), WS_CHILD|WS_VISIBLE|WS_BORDER|SS_LEFT, 0,0,0,0,hwnd,(HMENU)IDC_STATIC,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL); hlistbox = CreateWindow(TEXT("listbox"),NULL, WS_CHILD|WS_VISIBLE|LBS_STANDARD, 0,0,0,0,hwnd,(HMENU)IDC_LISTBOX,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL); for ( int i = 0; i < 26; i++) { //strings = (TCHAR *)malloc(sizeof(TCHAR) * 2); //保存一个字符 strings = new TCHAR[2]; TCHAR ch = 'A' + i; lstrcpy(strings , &ch); //strings[0] = 'A'+i; strings[1] = '\0'; SendMessage(hlistbox,LB_ADDSTRING,0,(LPARAM)strings); } SendMessage(hlistbox,LB_SETCURSEL,2,0); } return 0; case WM_SIZE: { xchar = LOWORD(GetDialogBaseUnits()); ychar = HIWORD(GetDialogBaseUnits()); xclinet = LOWORD(lparam); yclient = HIWORD(lparam); MoveWindow(hstatic,xclinet/4,yclient/8,xclinet/2,ychar,TRUE); MoveWindow(hlistbox,xclinet/4,yclient/4,xclinet/2,ychar*10,TRUE); } return 0 ; case WM_COMMAND: { if ( LOWORD(wparam) == IDC_LISTBOX && HIWORD(wparam) == LBN_SELCHANGE ) { index = SendMessage(hlistbox, LB_GETCURSEL,0,0); length = SendMessage(hlistbox, LB_GETTEXTLEN,index,0)+1 ; save = new TCHAR [sizeof(TCHAR) * length]; SendMessage(hlistbox,LB_GETTEXT,index,(LPARAM)save); // 原来的静态我文本还有字符 if ( szbuffer) { length += lstrlen(szbuffer); temp = new TCHAR[sizeof(TCHAR) * (lstrlen(szbuffer) + 1)]; lstrcpy(temp,szbuffer); //free(szbuffer); delete [] szbuffer; } szbuffer = new TCHAR[sizeof(TCHAR) * length]; if ( temp) { lstrcpy(szbuffer,temp); delete [] temp; } else //使用lstrcat 或则 strcat ,若接收器为空,则将第一位设成'\0', szbuffer[0] = '\0'; //这两个函数总是寻找'\0'作为起始位置 lstrcat(szbuffer,save); szbuffer[length-1] = '\0'; delete [] save; SetWindowText(hstatic,szbuffer); } } return 0; case WM_SETFOCUS: SetFocus(hlistbox); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,message,wparam,lparam); } |
//lstrcpy(strings , &ch);
strings[0] = 'A'+i;
将上述代码用注释的代码替换,窗口不显示出来,但是调试的时候还能显示出来,求原因!!
代码如下

#include <Windows.h>
#define IDC_STATIC 1
#define IDC_LISTBOX 2
LRESULT CALLBACK wndprog(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
TCHAR szappname[] = TEXT("mywindow");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc = wndprog;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szappname;
if ( !RegisterClass(&wndclass))
{
MessageBox(NULL,L"creat window failed!",szappname,MB_ICONERROR);
return 0 ;
}
hwnd = CreateWindow(szappname,TEXT("This is my window !"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL, NULL,
hInstance, NULL);
ShowWindow(hwnd,nShowCmd);
UpdateWindow(hwnd);
while( GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK wndprog(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
static HWND hlistbox, hstatic;
static int xclinet, yclient;
static int xchar, ychar;
static TCHAR *strings={NULL};
static TCHAR *szbuffer = NULL,*temp = NULL,*save = NULL;
int index, length,priorlength=0;
switch (message)
{
case WM_CREATE:
{
hstatic = CreateWindow(TEXT("static"),TEXT("nothing"),
WS_CHILD|WS_VISIBLE|WS_BORDER|SS_LEFT,
0,0,0,0,hwnd,(HMENU)IDC_STATIC,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
hlistbox = CreateWindow(TEXT("listbox"),NULL,
WS_CHILD|WS_VISIBLE|LBS_STANDARD,
0,0,0,0,hwnd,(HMENU)IDC_LISTBOX,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
for ( int i = 0; i < 26; i++)
{
strings = (TCHAR *)malloc(sizeof(TCHAR) * 2); //保存一个字符
//TCHAR ch = 'A' + i;
//lstrcpy(strings , &ch);
strings[0] = 'A'+i;
strings[1] = '\0';
SendMessage(hlistbox,LB_ADDSTRING,0,(LPARAM)strings);
}
SendMessage(hlistbox,LB_SETCURSEL,2,0);
}
return 0;
case WM_SIZE:
{
xchar = LOWORD(GetDialogBaseUnits());
ychar = HIWORD(GetDialogBaseUnits());
xclinet = LOWORD(lparam);
yclient = HIWORD(lparam);
MoveWindow(hstatic,xclinet/4,yclient/8,xclinet/2,ychar,TRUE);
MoveWindow(hlistbox,xclinet/4,yclient/4,xclinet/2,ychar*10,TRUE);
}
return 0 ;
case WM_COMMAND:
{
if ( LOWORD(wparam) == IDC_LISTBOX && HIWORD(wparam) == LBN_SELCHANGE )
{
index = SendMessage(hlistbox, LB_GETCURSEL,0,0);
length = SendMessage(hlistbox, LB_GETTEXTLEN,index,0)+1 ;
save = (TCHAR *)malloc(sizeof(TCHAR) * length);
SendMessage(hlistbox,LB_GETTEXT,index,(LPARAM)save);
// 原来的静态我文本还有字符
if ( szbuffer)
{
length += lstrlen(szbuffer);
temp = (TCHAR *)malloc(sizeof(TCHAR) * (lstrlen(szbuffer) + 1));
lstrcpy(temp,szbuffer);
free(szbuffer);
}
szbuffer = (TCHAR *)malloc( sizeof(TCHAR) * length);
if ( temp)
{
lstrcpy(szbuffer,temp);
free(temp);
}
else //使用lstrcat 或则 strcat ,若接收器为空,则将第一位设成'\0',
szbuffer[0] = '\0'; //这两个函数总是寻找'\0'作为起始位置
lstrcat(szbuffer,save);
szbuffer[length-1] = '\0';
free(save);
SetWindowText(hstatic,szbuffer);
}
}
return 0;
case WM_SETFOCUS:
SetFocus(hlistbox);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wparam,lparam);
}
#define IDC_STATIC 1
#define IDC_LISTBOX 2
LRESULT CALLBACK wndprog(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
TCHAR szappname[] = TEXT("mywindow");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc = wndprog;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szappname;
if ( !RegisterClass(&wndclass))
{
MessageBox(NULL,L"creat window failed!",szappname,MB_ICONERROR);
return 0 ;
}
hwnd = CreateWindow(szappname,TEXT("This is my window !"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL, NULL,
hInstance, NULL);
ShowWindow(hwnd,nShowCmd);
UpdateWindow(hwnd);
while( GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK wndprog(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
static HWND hlistbox, hstatic;
static int xclinet, yclient;
static int xchar, ychar;
static TCHAR *strings={NULL};
static TCHAR *szbuffer = NULL,*temp = NULL,*save = NULL;
int index, length,priorlength=0;
switch (message)
{
case WM_CREATE:
{
hstatic = CreateWindow(TEXT("static"),TEXT("nothing"),
WS_CHILD|WS_VISIBLE|WS_BORDER|SS_LEFT,
0,0,0,0,hwnd,(HMENU)IDC_STATIC,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
hlistbox = CreateWindow(TEXT("listbox"),NULL,
WS_CHILD|WS_VISIBLE|LBS_STANDARD,
0,0,0,0,hwnd,(HMENU)IDC_LISTBOX,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
for ( int i = 0; i < 26; i++)
{
strings = (TCHAR *)malloc(sizeof(TCHAR) * 2); //保存一个字符
//TCHAR ch = 'A' + i;
//lstrcpy(strings , &ch);
strings[0] = 'A'+i;
strings[1] = '\0';
SendMessage(hlistbox,LB_ADDSTRING,0,(LPARAM)strings);
}
SendMessage(hlistbox,LB_SETCURSEL,2,0);
}
return 0;
case WM_SIZE:
{
xchar = LOWORD(GetDialogBaseUnits());
ychar = HIWORD(GetDialogBaseUnits());
xclinet = LOWORD(lparam);
yclient = HIWORD(lparam);
MoveWindow(hstatic,xclinet/4,yclient/8,xclinet/2,ychar,TRUE);
MoveWindow(hlistbox,xclinet/4,yclient/4,xclinet/2,ychar*10,TRUE);
}
return 0 ;
case WM_COMMAND:
{
if ( LOWORD(wparam) == IDC_LISTBOX && HIWORD(wparam) == LBN_SELCHANGE )
{
index = SendMessage(hlistbox, LB_GETCURSEL,0,0);
length = SendMessage(hlistbox, LB_GETTEXTLEN,index,0)+1 ;
save = (TCHAR *)malloc(sizeof(TCHAR) * length);
SendMessage(hlistbox,LB_GETTEXT,index,(LPARAM)save);
// 原来的静态我文本还有字符
if ( szbuffer)
{
length += lstrlen(szbuffer);
temp = (TCHAR *)malloc(sizeof(TCHAR) * (lstrlen(szbuffer) + 1));
lstrcpy(temp,szbuffer);
free(szbuffer);
}
szbuffer = (TCHAR *)malloc( sizeof(TCHAR) * length);
if ( temp)
{
lstrcpy(szbuffer,temp);
free(temp);
}
else //使用lstrcat 或则 strcat ,若接收器为空,则将第一位设成'\0',
szbuffer[0] = '\0'; //这两个函数总是寻找'\0'作为起始位置
lstrcat(szbuffer,save);
szbuffer[length-1] = '\0';
free(save);
SetWindowText(hstatic,szbuffer);
}
}
return 0;
case WM_SETFOCUS:
SetFocus(hlistbox);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wparam,lparam);
}