C语言用windows.h创建按钮的问题

做了一个贪吃蛇的小游戏是程序初始进入的时候在界面上用 在 WM_PAINT 里 用 CreatWindow 做了一个按钮,当游戏结束的时候想重新返回这个界面,可是按钮却显示不出来?
就是想问怎么才能返回界面时显示出创建的按钮
ShowWindow(hWnd, iCmdShow);
UpdateWindow(hWnd);

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static int cxChar, cyChar;
static HWND hwndButton[10];
switch (message)
{
case WM_CREATE:
case WM_PAINT:
if (Flag)
{
PrepareSnake();
SetSnakeTime(hWnd, DEFAULT);
hwndButton[0] = CreateWindow(
TEXT("button"),
TEXT("Start"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
330,
180,
cxChar ,
cxChar ,
hWnd,
(HMENU)0,
((LPCREATESTRUCT)lParam)->hInstance,
ID_START);
return 0;
}

1、按钮自己有自己的绘制方法,不需要你在WM_PAINT里面搞。如果你在WM_PAINT里面弄,每次窗口刷新都会创建一个新的按钮……这显然不是你要的

2、因为按钮有自己的绘制方法,所以如果你不需要按钮了,应该隐藏它或者销毁它。不然你游戏绘制的过程中它还会时不时闪出来两下
3、还是因为按钮有自己的绘制方法,所以如果你需要按钮了,只要不隐藏它(之前如果隐藏这下就让它显示,之前如果是销毁现在就重新创建),它就能正常出来
4、WM_PAINT里面,怎么说呢,除非你很清楚地知道你在干什么,不然一般来说不要在里面放多余的代码(程序逻辑啊对象创建销毁啊之类之类追问

嗯,谢谢你。
是这样,我在WM_PAINT里面用了一个flag,如果游戏在运行就不进行if里面的指令,游戏结束之后就把flag重新赋值为true,还有,进入游戏是我是用的ShowWindow(SW_HIDE)让按钮隐藏,游戏结束后重新ShowWindow(SW_SHOWNA)。可是按钮还是显示不出来

追答

有flag也还是不能保证啊……你要知道WM_PAINT并不是只会调用一次的,你在进入游戏画面之前WM_PAINT并不能保证只调用一次。按钮的创建按照惯例,WM_CREATE里面。然后进入游戏以后ShowWindow来隐藏没错,恢复的时候SW_SHOWNA不行吗……SHOWNA没用过我只用过SHOW的,不过看了说明SHOWNA应该可以才对啊,会不会是保存窗口句柄的那个变量在游戏过程中被破坏掉了?这个是一个检查点,另一个可以尝试的地方是ShowWindow显示按钮之后会不会是被你的WM_PAINT把按钮抹掉看不见了,如果是这样,那么鼠标点击按钮所在位置还是可以点到按钮的,虽然看不到但是能点到。

追问

我把建按钮改到了Create里面用的是ShowWindow的HIDE和Normal,
调试的时候发现了一个问题,就是SendMeassage后程序没有进入WM_PAINT这一段
是怎么回事啊,不时候Send是不经过消息队列直接到达对象吗?

追答

你SendMessage发送了什么?

如果要重绘窗口的话,用的应该是 InvalidateRect 而不是直接给它Send一个WM_PAINT啊

追问

问题解决的基本差不多了,现在是这个按钮还是存在了,但是看不见,我去点还是有,

我用的是 ShowWindow(hButton[ID_START], SW_SHOW);
Normal我也试了一下,是一样的效果,是什么原因,是可能被Paint画出来的覆盖了吗
Show之前我用了 InvalidateRect(hWnd, NULL, TRUE);

追答

别……不是show之前用,是show之后用。

以及我觉得你在WM_PAINT里面要特别注意绘制的时候别把按钮覆盖掉了(就是别在有按钮的那一块绘图、填充颜色等)
如果对此表示没有信心或者要回避按钮所在的位置太麻烦,你可以参考一下ExcludeClipRect函数

追问

嗯,可是我Paint里面都是全窗口绘图的,Exclude就不适用了。
我觉得肯定就是被覆盖了,有其他的办法让按钮显示出来吗
而且我重新creat一个按钮也是隐藏在了后面,一点那个位子才出来

追答

是这样的,你在绘图之前,对着那个hdc调用excludecliprect,然后你之后的画图行为会自动绕过这一块的……

要不你画图之后对着按钮调用UpdateWindow看看能不能让按钮重绘,能的话就能出来了

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-02-19
把代码贴上来看看,便于分析。追问

这是创建窗口的核心部分,游戏结束之后,我SendMessage到了WM_PAINT

追答

游戏结束的时候,Flag有没有设置呢?用CreateWindow做按钮感觉比较少见哈。

追问

开始的时候和结束的时候Flag都赋为了TRUE

追答

那你Debug一下试试,在结束前放个断点,一步一步看看是不是用于返回的代码有问题。

追问

不用CreatWindow还能用别的做按钮吗?除了加载控件

追答

这个我就不太清楚了,这方面研究的不深入。

C语言用windows.h创建按钮的问题
1、按钮自己有自己的绘制方法,不需要你在WM_PAINT里面搞。如果你在WM_PAINT里面弄,每次窗口刷新都会创建一个新的按钮……这显然不是你要的 2、因为按钮有自己的绘制方法,所以如果你不需要按钮了,应该隐藏它或者销毁它。不然你游戏绘制的过程中它还会时不时闪出来两下 3、还是因为按钮有自己的绘制方...

C语言用windows.h创建按钮的问题
1、按钮自己有自己的绘制方法,不需要你在WM_PAINT里面搞。如果你在WM_PAINT里面弄,每次窗口刷新都会创建一个新的按钮……这显然不是你要的 2、因为按钮有自己的绘制方法,所以如果你不需要按钮了,应该隐藏它或者销毁它。不然你游戏绘制的过程中它还会时不时闪出来两下 3、还是因为按钮有自己的绘制方...

如何用C语言写一个button按钮
typedef _Bool bool;define false ((bool)0)define true ((bool)1)HWND ChuangJianChuangKou(char *a,bool(*b)(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam),bool c,int x,int y){ HWND hwnd;static TCHAR szAppName[] = TEXT("Mz Game") ;WNDCLASS wndclass ;wndclass.style = ...

C语言中设置按钮的方法
Windows 窗体程序是基于消息机制的,所有控件,它的本质都是一个窗体,都是使用 CreateWindows 函数来创建,不过类名,则需要指定为系统预先注册的控件类,比如,你要创建一个按钮控件,就要这样子 CreateWindows( "BUTTON", "按钮标题" ),CreateWindows 这个函数你应该用了不少了吧,其余的参数可以参考...

用C语言 怎么做出这个来
用MFC,一边学MFC,一边做,小半天功夫指定能写出来。\/\/main.cpp include <windows.h> 这些按钮,输入框其实就是调用一些windows api完成的。给你来段实际的代码:\/* The class is registered, let's create the program*\/ \/\/WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX 初始一个...

怎么用C语言编写菜单?
include "windows.h"char choice1;void main(){ void menue1();printf("欢迎进入Ben的作业查询系统!");menue1();} void menue1(){ void choicemenue1();printf("\\n请按照以下列表选择您想要查看的章节:");printf("\\n编号\\t章节\\n 1\\t第一章\\n 2\\t第二章\\n");printf("请输入编号...

学c语言如何做出有界面的程序
但还是可以的,#include<windows.h>要包含,然后按照创建窗口的方法创建就行了,很麻烦,如果你不了解winodows运行原理和编程原理你很难知道怎么去做一个实用窗口界面。。。不过有简单的方法,那就是不用C语言,改用MFC,Delphi,java,c#等专业的应用程序编程软件,C语言通常不用来做界面。。。

c语言windows.h程序问题
是的,这个头文件里包含了很多系统的其它头文件和库,它的功能超多,如果是用mfc编程的话这个头文件已被自动引用,直接调用win32 API函数有一个简单的例子,可以在vc6上试试,先建立工程,选win32 application 新建visual c++文件输入代码#include<windows.h>LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wpar...

C语言设计一个加减计数器,通过两个按键来控制。就是按一个键就加一...
如果是windows上程序。单词按键判断ASCII码,然后变量值++,--就可以了。include <stdio.h>#include <conio.h>#include <windows.h>#define KEYA 61\/\/按键盘'+'键(非小键盘)#define KEYM 45\/\/按键盘'-'键(非小键盘)int main(){ int key,num=0; while(1) { system("cls...

用c语言模仿windows界面和接收esc之类的功能键的问题
0 右边Shift键状态 1 左边Shift键状态 3 Ctrl键状态 4 Alt键状态 5 ScrollLock键状态 6 NumLock键状态 7 CapsLock键状态 8 Insert键状态 字节位为1表示该键被按下,为0表示松开。参考资料:http:\/\/zhidao.baidu.com\/question\/27032676.html?fr=qrl3 ...

相似回答