API GetWindowText的问题

zyc_0204 2008-09-13 05:32:39
保存为.c文件...
问题:
第一次单击菜单"双链表展示",GetWindowText可以得到值, 可以正常操作.
如:输入排序字符.插入链表.(字符排序,输入字符排为1)
第二次单击菜单"双链表",得不到值.怪!










//代码
#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
#define Node_Btn_t 104
#define Node_Btn_h 105
#define Node_Btn_add 106
#define Edit_value 107
HWND btn_add,btn_t,btn_h,edit_v;
HINSTANCE hInst;

int j=5;
int d=0;
HWND hbt2;
HMENU hmenu;
HMENU hsubmenu;


typedef struct Node{
int location;
char value;
struct Node * fore;
struct Node * tail;
}Node;
Node *head=0;
Node * CreateNode()
{
head=malloc(sizeof(Node)*18);
head->fore=head;
head->tail=head;
return head;

}
void AddNode(Node * head,Node * t)
{
t->tail=head->tail;
head->tail=t;

t->fore=head;
t->tail->fore=t;
}

int SearchNode(Node * head,Node *t)
{
Node *p=malloc(sizeof(Node));
int i=0;
p=head;
while(p->tail!=head)
{
p=p->tail;
i++;
if(p->value>=t->value)
{

break;

}

}

return i;
}
void sort(Node *head)
{
Node *p=malloc(sizeof(Node));
Node *q=malloc(sizeof(Node));
p=head;
while(p->tail!=head)
{
p=p->tail;
q=p->tail;
while(q!=head)
{
if(p->value>q->value)
{
char c;
c=q->value;
q->value=p->value;
p->value=c;
}
q=q->tail;
}

}
q=0;
p=0;
free(q);
free(p);
}



void mainx()
{
int i;
void deleteNode();
Node *p;
if(head==0)
head=CreateNode();
srand((unsigned)time(0));
for(i=0;i<8;i++)
{
p=malloc(sizeof(Node));
p->value=rand()%26+'a';
AddNode(head,p);

}

sort(head);

}

void deleteNode(Node *head)
{
Node *t=head->tail;
Node *s;
while(t!=head)
{
s=t;
t=t->tail;
s->tail->fore=s->fore;
s->fore->tail=s->tail;
free(s);
}
}

int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE PrevInstance,
LPSTR lpszCmdLine,
int nCmdShow)
{
MSG Msg;
HWND hwnd;
WNDCLASS wndclass;

hmenu=CreateMenu();
hsubmenu=CreatePopupMenu();
InsertMenu(hsubmenu,1,MF_STRING|MF_BYCOMMAND,1001,"1 双链表建演示");
InsertMenu(hsubmenu,2,MF_STRING|MF_BYCOMMAND,1002,"2 迷宫探索");
InsertMenu(hmenu,3,MF_POPUP,hsubmenu,"游戏选项");

wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(hInstance,101);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName="ok";
wndclass.lpszMenuName=0;
wndclass.style=0;

RegisterClass(&wndclass);

hwnd=CreateWindow("ok","菜单",WS_OVERLAPPEDWINDOW,0,0,800,600,0,hmenu,hInstance,0);

ShowWindow(hwnd,3);
UpdateWindow(hwnd);
hInst=hInstance;

while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;

}


char * turnstring(char c)
{
char *s=malloc(sizeof(char)*2);
s[0]=c;
s[1]='\0';
return s;
}
void drawnext(int i,HWND hwnd,int k)
{

HDC hdc=GetDC(hwnd);
SetTextColor(hdc,RGB(255,0,0));
SelectObject(hdc, CreatePen(PS_SOLID,1,RGB(255,0,0)));
switch(k)
{ case 1:


MoveToEx(hdc,70*(i-1)+65,180,0);
LineTo(hdc,70*(i-1)+66,180);
LineTo(hdc,70*(i-1)+66,95);
LineTo(hdc,70*(i-1)+73,95);
LineTo(hdc,70*(i-1)+68,93);
MoveToEx(hdc,70*(i-1)+73,95,0);
LineTo(hdc,70*(i-1)+68,97);
TextOut(hdc,70*(i-1)+75,120,"A->t=B->t",9);
break;
case 2:

//箭头

MoveToEx(hdc,45+70*(i-1),180,0);
LineTo(hdc,40+70*(i-1),182);
MoveToEx(hdc,45+70*(i-1),180,0);
LineTo(hdc,40+70*(i-1),178);
MoveToEx(hdc,45+70*(i-1),180,0);



//箭头

LineTo(hdc,39+70*(i-1),180);
LineTo(hdc,39+70*(i-1),95);
LineTo(hdc,35+70*(i-1),95);

SelectObject(hdc,CreatePen(PS_SOLID,1,RGB(255,255,255)));
MoveToEx(hdc,39+70*(i-1),95,0);
LineTo(hdc,66+70*(i-1),95);
TextOut(hdc,70*(i-1)+75,135,"B->t=A",6);
break;
case 3:


MoveToEx(hdc,45+70*(i-1),160,0);
LineTo(hdc,43+70*(i-1),160);
LineTo(hdc,43+70*(i-1),75);
LineTo(hdc,37+70*(i-1),75);
LineTo(hdc,42+70*(i-1),77);
MoveToEx(hdc,37+70*(i-1),75,0);
LineTo(hdc,42+70*(i-1),73);
//箭头
TextOut(hdc,70*(i-1)+75,150,"A->h=B",6);
break;
case 4:

MoveToEx(hdc,70*(i-1)+65,160,0);
LineTo(hdc,70*(i-1)+70,158);
MoveToEx(hdc,70*(i-1)+65,160,0);
LineTo(hdc,70*(i-1)+70,162);
MoveToEx(hdc,70*(i-1)+65,160,0);


LineTo(hdc,70*(i-1)+70,160);

LineTo(hdc,70*(i-1)+70,75);
LineTo(hdc,70*(i-1)+75,75);
SelectObject(hdc,CreatePen(PS_SOLID,1,RGB(255,255,255)));
MoveToEx(hdc,70*(i-1)+70,75,0);
LineTo(hdc,70*(i-1)+42,75);
TextOut(hdc,70*(i-1)+75,165,"A->t->h=A",9);
break;
default:
;
}
j=k+1;

}

void drawupdate(int i,char str[],HDC hdc)
{
char s[3];
int j=1;
_gcvt(i,2,s);
if('0'<=s[1]&&s[1]<='9')
j=2;

TextOut(hdc,70*(i-1)+30,150,"A",1);
TextOut(hdc,70*(i-1)+10,110,"B",1);
Rectangle(hdc,45+70*(i-1),110,70*(i-1)+65,190);
MoveToEx(hdc,45+70*(i-1),150,0);
LineTo(hdc,70*(i-1)+65,150);


TextOut(hdc,47+70*(i-1),115,s,j);
TextOut(hdc,47+70*(i-1),130,str,1);
TextOut(hdc,47+70*(i-1),155,"h",1);
TextOut(hdc,47+70*(i-1),170,"t",1);
}

void draw(int i,char c,HDC hdc)
{
char s[3];
int j=1;
char *str=turnstring(c);
_gcvt(i,2,s);
if('0'<=s[1]&&s[1]<='9')
j=2;
Rectangle(hdc,5+70*(i-1),25,70*(i-1)+35,105);

MoveToEx(hdc,5+70*(i-1),65,0);
LineTo(hdc,35+(i-1)*70,65);



//箭头
MoveToEx(hdc,70*(i-1)+35,95,0);
LineTo(hdc,70*(i-1)+73,95);

LineTo(hdc,70*(i-1)+68,93);
MoveToEx(hdc,70*(i-1)+73,95,0);
LineTo(hdc,70*(i-1)+68,97);

//箭头
MoveToEx(hdc,70*(i-1)+75,75,0);
LineTo(hdc,70*(i-1)+37,75);

LineTo(hdc,70*(i-1)+42,73);
MoveToEx(hdc,70*(i-1)+37,75,0);
LineTo(hdc,70*(i-1)+42,77);


TextOut(hdc,5+70*(i-1)+10,30,s,j);
TextOut(hdc,5+70*(i-1)+10,45,str,1);
TextOut(hdc,5+70*(i-1)+10,70,"h",1);
TextOut(hdc,5+70*(i-1)+10,85,"t",1);
free(str);
}


...全文
362 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wsphere 2008-09-13
  • 打赏
  • 举报
回复
楼主的程序有几处地方地方不需要申请内存,并且最后内存也没有释放。但是这不是主要原因,主要原因是在第二次点击菜单的时候,调用node(HWND hwnd)函数在同样的地方创建了两个同样的Edit,造成输入的时候总是在第一个里,所以使用第二次创建的Edit的句柄来GetWindowText()当然什么也没有了。其实我们在node(HWND hwnd)函数中应该先调用DestroyWindow(edit_v);函数来销毁原来的Edit.当然这里也要先判断edit_v是否等于NULL.
zyc_0204 2008-09-13
  • 打赏
  • 举报
回复
嗯..感谢greatws.非常感谢这么有耐心把代码看完...并提出建议..问题解决了!.
e_sharp 2008-09-13
  • 打赏
  • 举报
回复
修改了一下,可以完成添加功能,lz可以参考一下

GetWindowText(edit_v,s,3)没问题,主要问题是edit_v多次创建
e_sharp 2008-09-13
  • 打赏
  • 举报
回复

void node(HWND hwnd)
{
HDC hdc=GetDC(hwnd);

Node *p;

int i=0;
if(head!=0)
{
deleteNode(head);
}

Rectangle(hdc,0,20,800,200);
//Rectangle(hdc,810,0,1000,200);
TextOut(hdc,0,0,"双链表展示:",11);
//TextOut(hdc,890,10,"输入字符:",9);
//btn_add=CreateWindow("BUTTON","添加",WS_CHILD|WS_VISIBLE,820,20,50,30,hwnd,(HMENU)Node_Btn_add,hInst,NULL);
//btn_t=CreateWindow("BUTTON","下一步",WS_CHILD|WS_VISIBLE,820,120,50,30,hwnd,(HMENU)Node_Btn_t,hInst,NULL);
//edit_v=CreateWindow("EDIT","",WS_CHILD|WS_VISIBLE|ES_LEFT|WS_BORDER,880,30,100,20,hwnd,(HMENU)Edit_value,hInst,NULL);
mainx();
j=5;
p=head;

while(p->tail!=head)
{
p=p->tail;
i++;
draw(i,p->value,hdc);
}
}


void get(HWND hwnd)
{
HDC hdc=GetDC(hwnd);
Node *p=malloc(sizeof(Node));
Node *q;
int i=0;
char *s=malloc(sizeof(char)*3); //需要free
RECT r;
r.left=0;
r.top=20;
r.right=800;
r.bottom=200;
FillRect(hdc,&r,CreateSolidBrush(RGB(255,255,255)));
//CreateSolidBrush(RGB(
if(j <4)
{
MessageBox(hwnd,"演示尚未完","Error",0);
free(s);
return ;
}


if(0==GetWindowText(edit_v,s,3)) {
ShowErrMsg();

MessageBox(hwnd,"失败","查看",0);//出错的地方..........第一次单击菜单上的"双链表",
//GetWindowText可以得 到值
//第二次单击就GetWindowText得不到值..

free(s);

return;
}

SetWindowText(edit_v,"");

p->value=s[0];
AddNode(head,p); //添加新节点
sort(head); //排序

i=0;
p = head;
while(p->tail!=head) //显示
{
p=p->tail;
i++;
draw(i,p->value,hdc);
}

/*
d=1;
d=SearchNode(head,p)-1;
if(d>0)
{
q=head;
while(q->tail!=head)
{
q=q->tail;
i++;
draw(i,q->value,hdc);
}
j=1;
drawupdate(d,s,hdc);
AddNode(head,p);
}
*/

free(s);
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;

case WM_COMMAND:
switch(LOWORD(wParam))
{
case 1001:
node(hwnd);
break;
case Node_Btn_add:
get(hwnd);
break;
case Node_Btn_t:
drawnext(d,hwnd,j);
break;
}
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}

return (0);
}
e_sharp 2008-09-13
  • 打赏
  • 举报
回复
#include <windows.h> 

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

#define Node_Btn_t 104
#define Node_Btn_h 105
#define Node_Btn_add 106
#define Edit_value 107

HWND btn_add,btn_t,btn_h,edit_v;
HINSTANCE hInst;

int j=5;
int d=0;
HWND hbt2;
HMENU hmenu;
HMENU hsubmenu;


typedef struct Node{
int location;
char value;
struct Node * fore;
struct Node * tail;
}Node;

Node *head=0; //最后不好忘记释放链表

Node * CreateNode()
{
head=malloc(sizeof(Node)*18);
head->fore=head;
head->tail=head;
return head;

}

void AddNode(Node * head,Node * t)
{
t->tail=head->tail;
head->tail=t;

t->fore=head;
t->tail->fore=t;
}

int SearchNode(Node * head,Node *t)
{
Node *p;//=malloc(sizeof(Node)); //仅仅是指针操作,不需要分配空间
int i=0;
p=head;
while(p->tail!=head)
{
p=p->tail;
i++;
if(p->value >= t->value)
{
break;
}
}

return i;
}

void sort(Node *head)
{
Node *p;//=malloc(sizeof(Node)); //仅仅是指针操作,不需要分配空间
Node *q;//=malloc(sizeof(Node));
p=head;
while(p->tail!=head)
{
p=p->tail;
q=p->tail;
while(q!=head)
{
if(p->value>q->value)
{
char c;
c=q->value;
q->value=p->value;
p->value=c;
}
q=q->tail;
}
}

q=0;
p=0;

//free(q);
//free(p);
}


void mainx()
{
int i;
void deleteNode();
Node *p;
if(head==0)
head=CreateNode();

srand((unsigned)time(0));
for(i=0;i <8;i++)
{
p=malloc(sizeof(Node));
p->value=rand()%26+'a';
AddNode(head,p);
}

sort(head);

}

void deleteNode(Node *head)
{
Node *t=head->tail;
Node *s;
while(t!=head)
{
s=t;
t=t->tail;
s->tail->fore=s->fore;
s->fore->tail=s->tail;
free(s);
}
}

void ShowErrMsg()
{
TCHAR szBuf[80];
LPVOID lpMsgBuf;
DWORD dw = GetLastError();

FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL );

MessageBox(NULL, lpMsgBuf, "系统错误", MB_OK|MB_ICONSTOP);

LocalFree(lpMsgBuf);
}

int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE PrevInstance,
LPSTR lpszCmdLine,
int nCmdShow)
{
MSG Msg;
HWND hwnd;
WNDCLASS wndclass;

hmenu=CreateMenu();
hsubmenu=CreatePopupMenu();
InsertMenu(hsubmenu,1,MF_STRING|MF_BYCOMMAND,1001,"1 双链表建演示");
InsertMenu(hsubmenu,2,MF_STRING|MF_BYCOMMAND,1002,"2 迷宫探索");
InsertMenu(hmenu,3,MF_POPUP,hsubmenu,"游戏选项");

wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(hInstance,101);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName="ok";
wndclass.lpszMenuName=0;
wndclass.style=0;

RegisterClass(&wndclass);

hwnd=CreateWindow("ok","菜单",WS_OVERLAPPEDWINDOW,0,0,800,600,0,hmenu,hInstance,0);

ShowWindow(hwnd,3);
UpdateWindow(hwnd);
hInst=hInstance;

//放在node(HWND hwnd) 会在同一位置多次创建edit_v
btn_add=CreateWindow("BUTTON","添加",WS_CHILD|WS_VISIBLE,820,20,50,30,hwnd,(HMENU)Node_Btn_add,hInst,NULL);
btn_t=CreateWindow("BUTTON","下一步",WS_CHILD|WS_VISIBLE,820,120,50,30,hwnd,(HMENU)Node_Btn_t,hInst,NULL);
edit_v=CreateWindow("EDIT","",WS_CHILD|WS_VISIBLE|ES_LEFT|WS_BORDER,880,30,100,20,hwnd,(HMENU)Edit_value,hInst,NULL);

while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;

}


char * turnstring(char c)
{
char *s=malloc(sizeof(char)*2);
s[0]=c;
s[1]='\0';
return s;
}

void drawnext(int i,HWND hwnd,int k)
{
HDC hdc=GetDC(hwnd);
SetTextColor(hdc,RGB(255,0,0));
SelectObject(hdc, CreatePen(PS_SOLID,1,RGB(255,0,0)));

switch(k)
{
case 1:
MoveToEx(hdc,70*(i-1)+65,180,0);
LineTo(hdc,70*(i-1)+66,180);
LineTo(hdc,70*(i-1)+66,95);
LineTo(hdc,70*(i-1)+73,95);
LineTo(hdc,70*(i-1)+68,93);
MoveToEx(hdc,70*(i-1)+73,95,0);
LineTo(hdc,70*(i-1)+68,97);
TextOut(hdc,70*(i-1)+75,120,"A->t=B->t",9);
break;

case 2:
//箭头
MoveToEx(hdc,45+70*(i-1),180,0);
LineTo(hdc,40+70*(i-1),182);
MoveToEx(hdc,45+70*(i-1),180,0);
LineTo(hdc,40+70*(i-1),178);
MoveToEx(hdc,45+70*(i-1),180,0);

//箭头
LineTo(hdc,39+70*(i-1),180);
LineTo(hdc,39+70*(i-1),95);
LineTo(hdc,35+70*(i-1),95);

SelectObject(hdc,CreatePen(PS_SOLID,1,RGB(255,255,255)));
MoveToEx(hdc,39+70*(i-1),95,0);
LineTo(hdc,66+70*(i-1),95);
TextOut(hdc,70*(i-1)+75,135,"B->t=A",6);
break;

case 3:
MoveToEx(hdc,45+70*(i-1),160,0);
LineTo(hdc,43+70*(i-1),160);
LineTo(hdc,43+70*(i-1),75);
LineTo(hdc,37+70*(i-1),75);
LineTo(hdc,42+70*(i-1),77);
MoveToEx(hdc,37+70*(i-1),75,0);
LineTo(hdc,42+70*(i-1),73);
//箭头
TextOut(hdc,70*(i-1)+75,150,"A->h=B",6);
break;

case 4:
MoveToEx(hdc,70*(i-1)+65,160,0);
LineTo(hdc,70*(i-1)+70,158);
MoveToEx(hdc,70*(i-1)+65,160,0);
LineTo(hdc,70*(i-1)+70,162);
MoveToEx(hdc,70*(i-1)+65,160,0);

LineTo(hdc,70*(i-1)+70,160);

LineTo(hdc,70*(i-1)+70,75);
LineTo(hdc,70*(i-1)+75,75);
SelectObject(hdc,CreatePen(PS_SOLID,1,RGB(255,255,255)));
MoveToEx(hdc,70*(i-1)+70,75,0);
LineTo(hdc,70*(i-1)+42,75);
TextOut(hdc,70*(i-1)+75,165,"A->t->h=A",9);
break;

default:
break;
}

j=k+1;

}

void drawupdate(int i,char str[],HDC hdc)
{
char s[3];
int j=1;
_gcvt(i,2,s);
if('0' <=s[1]&&s[1] <='9')
j=2;

TextOut(hdc,70*(i-1)+30,150,"A",1);
TextOut(hdc,70*(i-1)+10,110,"B",1);
Rectangle(hdc,45+70*(i-1),110,70*(i-1)+65,190);
MoveToEx(hdc,45+70*(i-1),150,0);
LineTo(hdc,70*(i-1)+65,150);


TextOut(hdc,47+70*(i-1),115,s,j);
TextOut(hdc,47+70*(i-1),130,str,1);
TextOut(hdc,47+70*(i-1),155,"h",1);
TextOut(hdc,47+70*(i-1),170,"t",1);

}

void draw(int i,char c,HDC hdc)
{
char s[3];
int j=1;
char *str=turnstring(c);
_gcvt(i,2,s);
if('0' <=s[1]&&s[1] <='9')
j=2;
Rectangle(hdc,5+70*(i-1),25,70*(i-1)+35,105);

MoveToEx(hdc,5+70*(i-1),65,0);
LineTo(hdc,35+(i-1)*70,65);


//箭头
MoveToEx(hdc,70*(i-1)+35,95,0);
LineTo(hdc,70*(i-1)+73,95);

LineTo(hdc,70*(i-1)+68,93);
MoveToEx(hdc,70*(i-1)+73,95,0);
LineTo(hdc,70*(i-1)+68,97);

//箭头
MoveToEx(hdc,70*(i-1)+75,75,0);
LineTo(hdc,70*(i-1)+37,75);

LineTo(hdc,70*(i-1)+42,73);
MoveToEx(hdc,70*(i-1)+37,75,0);
LineTo(hdc,70*(i-1)+42,77);


TextOut(hdc,5+70*(i-1)+10,30,s,j);
TextOut(hdc,5+70*(i-1)+10,45,str,1);
TextOut(hdc,5+70*(i-1)+10,70,"h",1);
TextOut(hdc,5+70*(i-1)+10,85,"t",1);
free(str);
}
e_sharp 2008-09-13
  • 打赏
  • 举报
回复
修改了一下,可以完成添加功能,lz可以参考一下

[code=C/C++]#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

#define Node_Btn_t 104
#define Node_Btn_h 105
#define Node_Btn_add 106
#define Edit_value 107

HWND btn_add,btn_t,btn_h,edit_v;
HINSTANCE hInst;

int j=5;
int d=0;
HWND hbt2;
HMENU hmenu;
HMENU hsubmenu;


typedef struct Node{
int location;
char value;
struct Node * fore;
struct Node * tail;
}Node;

Node *head=0; //最后不好忘记释放链表

Node * CreateNode()
{
head=malloc(sizeof(Node)*18);
head->fore=head;
head->tail=head;
return head;

}

void AddNode(Node * head,Node * t)
{
t->tail=head->tail;
head->tail=t;

t->fore=head;
t->tail->fore=t;
}

int SearchNode(Node * head,Node *t)
{
Node *p;//=malloc(sizeof(Node)); //仅仅是指针操作,不需要分配空间
int i=0;
p=head;
while(p->tail!=head)
{
p=p->tail;
i++;
if(p->value >= t->value)
{
break;
}
}

return i;
}

void sort(Node *head)
{
Node *p;//=malloc(sizeof(Node)); //仅仅是指针操作,不需要分配空间
Node *q;//=malloc(sizeof(Node));
p=head;
while(p->tail!=head)
{
p=p->tail;
q=p->tail;
while(q!=head)
{
if(p->value>q->value)
{
char c;
c=q->value;
q->value=p->value;
p->value=c;
}
q=q->tail;
}
}

q=0;
p=0;

//free(q);
//free(p);
}


void mainx()
{
int i;
void deleteNode();
Node *p;
if(head==0)
head=CreateNode();

srand((unsigned)time(0));
for(i=0;i <8;i++)
{
p=malloc(sizeof(Node));
p->value=rand()%26+'a';
AddNode(head,p);
}

sort(head);

}

void deleteNode(Node *head)
{
Node *t=head->tail;
Node *s;
while(t!=head)
{
s=t;
t=t->tail;
s->tail->fore=s->fore;
s->fore->tail=s->tail;
free(s);
}
}

void ShowErrMsg()
{
TCHAR szBuf[80];
LPVOID lpMsgBuf;
DWORD dw = GetLastError();

FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL );

MessageBox(NULL, lpMsgBuf, "系统错误", MB_OK|MB_ICONSTOP);

LocalFree(lpMsgBuf);
}

int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE PrevInstance,
LPSTR lpszCmdLine,
int nCmdShow)
{
MSG Msg;
HWND hwnd;
WNDCLASS wndclass;

hmenu=CreateMenu();
hsubmenu=CreatePopupMenu();
InsertMenu(hsubmenu,1,MF_STRING|MF_BYCOMMAND,1001,"1 双链表建演示");
InsertMenu(hsubmenu,2,MF_STRING|MF_BYCOMMAND,1002,"2 迷宫探索");
InsertMenu(hmenu,3,MF_POPUP,hsubmenu,"游戏选项");

wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(hInstance,101);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName="ok";
wndclass.lpszMenuName=0;
wndclass.style=0;

RegisterClass(&wndclass);

hwnd=CreateWindow("ok","菜单",WS_OVERLAPPEDWINDOW,0,0,800,600,0,hmenu,hInstance,0);

ShowWindow(hwnd,3);
UpdateWindow(hwnd);
hInst=hInstance;

//放在node(HWND hwnd) 会在同一位置多次创建edit_v
btn_add=CreateWindow("BUTTON","添加",WS_CHILD|WS_VISIBLE,820,20,50,30,hwnd,(HMENU)Node_Btn_add,hInst,NULL);
btn_t=CreateWindow("BUTTON","下一步",WS_CHILD|WS_VISIBLE,820,120,50,30,hwnd,(HMENU)Node_Btn_t,hInst,NULL);
edit_v=CreateWindow("EDIT","",WS_CHILD|WS_VISIBLE|ES_LEFT|WS_BORDER,880,30,100,20,hwnd,(HMENU)Edit_value,hInst,NULL);

while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;

}


char * turnstring(char c)
{
char *s=malloc(sizeof(char)*2);
s[0]=c;
s[1]='\0';
return s;
}

void drawnext(int i,HWND hwnd,int k)
{
HDC hdc=GetDC(hwnd);
SetTextColor(hdc,RGB(255,0,0));
SelectObject(hdc, CreatePen(PS_SOLID,1,RGB(255,0,0)));

switch(k)
{
case 1:
MoveToEx(hdc,70*(i-1)+65,180,0);
LineTo(hdc,70*(i-1)+66,180);
LineTo(hdc,70*(i-1)+66,95);
LineTo(hdc,70*(i-1)+73,95);
LineTo(hdc,70*(i-1)+68,93);
MoveToEx(hdc,70*(i-1)+73,95,0);
LineTo(hdc,70*(i-1)+68,97);
TextOut(hdc,70*(i-1)+75,120,"A->t=B->t",9);
break;

case 2:
//箭头
MoveToEx(hdc,45+70*(i-1),180,0);
LineTo(hdc,40+70*(i-1),182);
MoveToEx(hdc,45+70*(i-1),180,0);
LineTo(hdc,40+70*(i-1),178);
MoveToEx(hdc,45+70*(i-1),180,0);

//箭头
LineTo(hdc,39+70*(i-1),180);
LineTo(hdc,39+70*(i-1),95);
LineTo(hdc,35+70*(i-1),95);

SelectObject(hdc,CreatePen(PS_SOLID,1,RGB(255,255,255)));
MoveToEx(hdc,39+70*(i-1),95,0);
LineTo(hdc,66+70*(i-1),95);
TextOut(hdc,70*(i-1)+75,135,"B->t=A",6);
break;

case 3:
MoveToEx(hdc,45+70*(i-1),160,0);
LineTo(hdc,43+70*(i-1),160);
LineTo(hdc,43+70*(i-1),75);
LineTo(hdc,37+70*(i-1),75);
LineTo(hdc,42+70*(i-1),77);
MoveToEx(hdc,37+70*(i-1),75,0);
LineTo(hdc,42+70*(i-1),73);
//箭头
TextOut(hdc,70*(i-1)+75,150,"A->h=B",6);
break;

case 4:
MoveToEx(hdc,70*(i-1)+65,160,0);
LineTo(hdc,70*(i-1)+70,158);
MoveToEx(hdc,70*(i-1)+65,160,0);
LineTo(hdc,70*(i-1)+70,162);
MoveToEx(hdc,70*(i-1)+65,160,0);

LineTo(hdc,70*(i-1)+70,160);

LineTo(hdc,70*(i-1)+70,75);
LineTo(hdc,70*(i-1)+75,75);
SelectObject(hdc,CreatePen(PS_SOLID,1,RGB(255,255,255)));
MoveToEx(hdc,70*(i-1)+70,75,0);
LineTo(hdc,70*(i-1)+42,75);
TextOut(hdc,70*(i-1)+75,165,"A->t->h=A",9);
break;

default:
break;
}

j=k+1;

}

void drawupdate(int i,char str[],HDC hdc)
{
char s[3];
int j=1;
_gcvt(i,2,s);
if('0' <=s[1]&&s[1] <='9')
j=2;

TextOut(hdc,70*(i-1)+30,150,"A",1);
TextOut(hdc,70*(i-1)+10,110,"B",1);
Rectangle(hdc,45+70*(i-1),110,70*(i-1)+65,190);
MoveToEx(hdc,45+70*(i-1),150,0);
LineTo(hdc,70*(i-1)+65,150);


TextOut(hdc,47+70*(i-1),115,s,j);
TextOut(hdc,47+70*(i-1),130,str,1);
TextOut(hdc,47+70*(i-1),155,"h",1);
TextOut(hdc,47+70*(i-1),170,"t",1);

}

code]
greatws 2008-09-13
  • 打赏
  • 举报
回复
看了下问题不少
Node *p=malloc(sizeof(Node));
malloc返回是一个void*指针,要转换为Node*指针,需要注意这点
Node *p=(Node*)malloc(sizeof(Node));

初始化句柄和指针之类的要置NULL,还有,不要用0代替NULL。
每次点击菜单,你都在相同位置创建按钮,导致第二次点击不知道是哪个,所以不显示


HWND btn_add = NULL, btn_t = NULL ,btn_h = NULL, edit_v = NULL;
HINSTANCE hInst = NULL;


//第二次时候判断下,就不用再创建了
if(btn_add == NULL) //判断是否第一次点
{
Rectangle(hdc,0,20,800,200);
Rectangle(hdc,810,0,1000,200);
TextOut(hdc,0,0,"双链表展示:",11);
TextOut(hdc,890,10,"输入字符:",9);
btn_add=CreateWindow("BUTTON","添加",WS_CHILD|WS_VISIBLE,820,20,50,30,hwnd,(HMENU)Node_Btn_add,hInst,NULL);
btn_t=CreateWindow("BUTTON","下一步",WS_CHILD|WS_VISIBLE,820,120,50,30,hwnd,(HMENU)Node_Btn_t,hInst,NULL);
edit_v=CreateWindow("EDIT","",WS_CHILD|WS_VISIBLE|ES_LEFT|WS_BORDER,880,30,100,20,hwnd,(HMENU)Edit_value,hInst,NULL);
}





这里还有问题

void draw(int i,char c,HDC hdc)
{
char s[100]; //3不够,要越界,我没仔细计算需要多少,写了多了一点,你可以看下实际需要多少
int j=1;
char *str=turnstring(c);
_gcvt(i,2,s);
if('0' <=s[1]&&s[1] <='9')
j=2;
//...
}

void drawupdate(int i,char str[],HDC hdc)
{
char s[100]; ///////////////////同上
int j=1;
_gcvt(i,2,s);
//...
}


Node * CreateNode()
{
head=(Node*)malloc(sizeof(Node)/* *18 */); //分配这个干嘛?
head->fore=head;
head->tail=head;
return head;

}

void mainx()
{
int i;
//void deleteNode(); //这又是什么意思??
Node *p;
///。。。
}






这里没必要分配和释放

void sort(Node *head)
{
Node *p = NULL;//=(Node*)malloc(sizeof(Node));
Node *q = NULL;//=(Node*)malloc(sizeof(Node));
p=head;
while(p->tail!=head)
{
p=p->tail;
q=p->tail;
while(q!=head)
{
if(p->value>q->value)
{
char c;
c=q->value;
q->value=p->value;
p->value=c;
}
q=q->tail;
}

}
//q=0;
//p=0;
//free(q);
//free(p);
}
sjdev 2008-09-13
  • 打赏
  • 举报
回复
还不如你把代码发过来,我帮你调。反正现在没事。
jameshooo 2008-09-13
  • 打赏
  • 举报
回复
用InternalGetWindowText试试
zyc_0204 2008-09-13
  • 打赏
  • 举报
回复

void node(HWND hwnd)
{

HDC hdc=GetDC(hwnd);

Node *p;

int i=0;
if(head!=0)
{
deleteNode(head);

}
Rectangle(hdc,0,20,800,200);
Rectangle(hdc,810,0,1000,200);
TextOut(hdc,0,0,"双链表展示:",11);
TextOut(hdc,890,10,"输入字符:",9);
btn_add=CreateWindow("BUTTON","添加",WS_CHILD|WS_VISIBLE,820,20,50,30,hwnd,(HMENU)Node_Btn_add,hInst,NULL);
btn_t=CreateWindow("BUTTON","下一步",WS_CHILD|WS_VISIBLE,820,120,50,30,hwnd,(HMENU)Node_Btn_t,hInst,NULL);
edit_v=CreateWindow("EDIT","",WS_CHILD|WS_VISIBLE|ES_LEFT|WS_BORDER,880,30,100,20,hwnd,(HMENU)Edit_value,hInst,NULL);
mainx();
j=5;
p=head;
while(p->tail!=head)
{
p=p->tail;
i++;
draw(i,p->value,hdc);
}
}


void get(HWND hwnd)
{

HDC hdc=GetDC(hwnd);
Node *p=malloc(sizeof(Node));
Node *q;
int i=0;
char *s=malloc(sizeof(char)*3);
RECT r;
r.left=0;
r.top=20;
r.right=800;
r.bottom=200;
FillRect(hdc,&r,CreateSolidBrush(RGB(255,255,255)));
//CreateSolidBrush(RGB(
if(j<4)
{
MessageBox(hwnd,"演示尚未完","Error",0);
return ;
}


if(0==GetWindowText(edit_v,s,3))

MessageBox(hwnd,"失败","查看",0);//出错的地方..........第一次单击菜单上的"双链表",
//GetWindowText可以得 到值
//第二次单击就GetWindowText得不到值..
p->value=s[0];
sort(head);
d=1;
d=SearchNode(head,p)-1;
if(d>0)
{
q=head;
while(q->tail!=head)
{
q=q->tail;
i++;
draw(i,q->value,hdc);
}
j=1;
drawupdate(d,s,hdc);
AddNode(head,p);
}

// }
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{


switch(message)
{

case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{ case 1001:
node(hwnd);
break;
case Node_Btn_add:
get(hwnd);
break;
case Node_Btn_t:
drawnext(d,hwnd,j);
break;


}
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return (0);
}

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧