关于窗口重绘和图片循环出现
我创建了个窗口,并在窗口中添加了一个按钮,点击按钮1次,出现提示:你点击了 1 次,这里的 1 是个图片1,现在有10张图片,全部都要根据点击的次数循环出现,该怎么实现呢?不会是从1到9的图片都放到那个选项下面然后通过点击的次数判断该出现哪一张吧?请高手帮忙解决,
还有个问题是,我点标题栏把窗口的左半部分拖动到屏幕外面去了,让按钮露出来一半,再拖回来发现上面的那个按钮只有一半了,出现的那张图片不见了,(按钮和图片都在窗口的左半部分上)窗口重绘为什么没有把那个图片给绘出来呢?该怎么解决这个问题呢?在百度上找也不知道从何找起,
代码如下,再请各位朋友帮忙看看程序的排版和需要改正的地方吧:
#include <windows.h>
#include <stdio.h>
#include "resource.h"
HDC BGbmpDC=NULL;
HBITMAP BGbmp2=NULL,BGbmp3;
HINSTANCE hBmpInstance;
BITMAP Bmp; //BITMAP是结构体
//需要被uMsg回调消息的自定义窗口函数zhaofeng(参数);
LRESULT CALLBACK zhaofeng( //这里有一个
HWND hwnd, // 你要控制的那个窗口的句柄。
UINT uMsg, // 消息标识
WPARAM wParam, // 第一个消息参数
LPARAM lParam // 第二个消息参数
);
//WinMain(相关参数){窗口类的信息}
WINAPI WinMain(
HINSTANCE hInstance, // 程序当前实例的句柄;以后随时可以用GetModuleHandle(0)来获得
HINSTANCE hPrevInstance, // 程序前一个实例的句柄,这个参数在win32环境下总是0,已经废弃了。
LPSTR lpCmdLine, // 应用程序的命令行,不包括程序名。检索整个命令行使用的getcommandline的功能
int SW_nCmdShow // 指明应该以什么方式显示主窗口,如最大化,最小化,隐藏等。
)
{
//获取实例
hBmpInstance = hInstance;
//设计一个窗口类
WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); //背景颜色
wndcls.hCursor=LoadCursor(NULL,IDC_ARROW); //鼠标在窗口内的形状。
wndcls.hIcon=LoadIcon(hInstance, (LPCTSTR)IDI_ICON1); //最小化图标。IDI_ERROR是左上角图标句柄,如果为0,就是另外一种窗口图标
wndcls.hInstance=hInstance; //应用程序实例句柄由WinMain函数传进来
wndcls.lpfnWndProc=zhaofeng; //指明回调函数,要回调自己定义的那个函数
wndcls.lpszClassName="sunxin2006"; //给自己的窗口注册一个类名,后面调用就能找到,
wndcls.lpszMenuName=NULL; //系统菜单,如新游戏,帮助等,如果没有就定义为NULL,
wndcls.style=CS_HREDRAW | CS_VREDRAW; //类的样式,可以使任何组合。
RegisterClass(&wndcls); //用这个函数创建一个类;
#define btn1 7
//创建主窗口,定义一个变量用来保存成功创建窗口后返回的句柄
HWND hwnd,hButton1;
hwnd=CreateWindow("sunxin2006","小游戏?", //标题栏的名字;类名要跟上面注册的一样,不然出错
WS_OVERLAPPEDWINDOW,190,20,900,820,NULL,NULL,hInstance,NULL);
hButton1 = CreateWindow("button", "Btn1",
WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 100, 100, 100, 30, hwnd, (HMENU)btn1,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL); //按钮的各项参数;
HDC windowDC = GetDC(hwnd); //创建兼容设备
BGbmpDC=CreateCompatibleDC(windowDC); //加载窗口显示内容
//BGbmp1 = CreateCompatibleBitmap(windowDC,414,460);
BGbmp2 = (HBITMAP)LoadImage(hInstance, MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0,
/*LR_LOADFROMFILE|*/LR_CREATEDIBSECTION); //加载位图
GetObject(BGbmp2,sizeof(BITMAP),&Bmp); //获取位图尺寸
//显示及刷新窗口
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
//定义消息结构体,开始消息循环
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//消息过程、回调函数(参数){函数体}
//此函数处理应用程序从操作系统接收的许多消息。收到的消息都在这里经过响应。
LRESULT CALLBACK zhaofeng( //这里有一个。
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(uMsg)
{
case WM_CHAR:
char szChar[19];
sprintf(szChar,"char code is %d",wParam);
break;
case WM_COMMAND: //在某个控件被单击时进行处理
switch(LOWORD(wParam))
{
case btn1:
{
int i=0;
i++;
if(i==1)
BGbmp3 = (HBITMAP)LoadImage(hBmpInstance, MAKEINTRESOURCE(IDB_B1), IMAGE_BITMAP, 0, 0,
/*LR_LOADFROMFILE|*/LR_CREATEDIBSECTION); //加载位图
GetObject(BGbmp2,sizeof(BITMAP),&Bmp); //获取位图尺寸
SelectObject(BGbmpDC,BGbmp3); //将位图添加到设备;
BitBlt(GetDC(hwnd),0,0,Bmp.bmWidth,Bmp.bmHeight,BGbmpDC,0,0,SRCCOPY); //显示位图
}
break;
default: //其他情况系统自行处理;
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
break;
case WM_PAINT: //下面提到的这个处理,刷新画面用到这个东西。
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
SelectObject(BGbmpDC,BGbmp2); //将位图添加到设备;
BitBlt(GetDC(hwnd),0,0,Bmp.bmWidth,Bmp.bmHeight,BGbmpDC,0,0,SRCCOPY); //显示位图
TextOut(hDC,0,0,"http://",strlen("z")); //该函数将窗口工作区的信息全部放到一起,(hDC:设备环境的句柄,0,0:字符串对齐的位置,“zhaofengxiang",字符串的内容,strlen("alkg")出现在屏幕上的字符串的长度)
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"真的要退出吗?","小窗口标题",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
EndPaint(hwnd,&ps); //对WM_PAINT的处理到这里结束。
PostQuitMessage(0);
break;
default: //其他情况是系统自行处理
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
谢谢大家了
[ 本帖最后由 小赵q1 于 2012-4-17 06:58 编辑 ]