第七章 资源在Windows编程中的应用 P157 7-8

资源在基于SDK的程序设计中的应用实验

一、实验目的

1.掌握各种资源的应用及资源应用的程序设计方法。

 

二、实验内容及步骤

实验任务

1.熟悉菜单资源的创建过程;

2.熟悉位图资源的创建;

3.熟悉对话框资源的应用;

4.熟悉图标资源。

实验内容

在一个窗口中央加载一个任意位图,位图尺寸为窗口面积的四分之一,当单击鼠标左键或键盘上的向上箭头时,位图向上移动,当移动到窗口的上边界时,窗口显示不能再向上移动了字样,当单击鼠标右键或键盘上的向下箭头时,位图向下移动,当到达窗口的下边界时,屏幕显示不能再向下移动了字样。

程序代码:

#include <windows.h>

long WINAPI WndProc(HWND hWnd,UINT iMessage,

UINT wParam,LONG lParam); //消息处理函数声明.

BOOL InitWindowsClass(HINSTANCE hInstance); //初始化窗口类声明

BOOL InitWindows(HINSTANCE hInstance, int nCmdShow); //初始化窗口声明

HWND hWndMain; //定义窗口句柄

HDC hDC; //定义设备环境句柄

HDC hdcmem; //定义内存句柄

HBITMAP hBm; //定义位图句柄

BITMAP bm; //定义位图结构变量

int iY=80; //位图左上角初始y坐标

int iWindowWidth,iWindowHeight; //窗口的宽度和高度

char cUpWarn[]="不能再向上移动了"; //向上警告字符串

char cDownWarn[]="不能再向下移动了"; //向下警告字符串

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,

LPSTR lpCmdLine,int nCmdShow)

{

MSG Message; //定义消息变量

hBm=LoadBitmap(hInstance,"forest"); //加载位图

GetObject(hBm,sizeof(BITMAP),(LPVOID)&bm); //获得位图信息

iWindowWidth=2*bm.bmWidth; //得到窗口的宽度

iWindowHeight=2*bm.bmHeight; //得到窗口的高度

if(!InitWindowsClass(hInstance)) //初始化窗口类

return FALSE;

if(!InitWindows(hInstance,nCmdShow)) //初始化窗口

return FALSE;

while(GetMessage(&Message,0,0,0))

{

TranslateMessage(&Message); //消息循环

DispatchMessage(&Message);

}

return Message.wParam;

}

long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)

{

PAINTSTRUCT ps; //定义包含绘图信息的结构变量

switch(iMessage)

{

case WM_LBUTTONDOWN: //点击鼠标左键

iY=iY-10; //位图高度-10

InvalidateRect(hWnd,NULL,1); //刷新用户区

break;

case WM_RBUTTONDOWN: //点击鼠标右键

iY=iY+10; //位图高度+10

InvalidateRect(hWnd,NULL,1); //刷新用户区

break;

case WM_KEYDOWN:

switch(wParam)

{

case VK_UP: //按上箭头时,位置-10

iY=iY-10;

break;

case VK_DOWN: //按下箭头时,位置+10

iY=iY+10;

break;

}

InvalidateRect(hWnd,NULL,1); //刷新用户区

break;

case WM_CREATE: //初始化窗口消息

hDC=GetDC(hWnd); //得到设备环境指针

hdcmem=CreateCompatibleDC(hDC); //得到内存指针

ReleaseDC(hWnd,hDC); //删除设备环境指针

case WM_PAINT: //处理绘图消息

hDC=BeginPaint(hWnd,&ps); //得到设备环境指针

if(iY>0&&iY<iWindowHeight/2) //当位图完整的在窗口中时

{

SelectObject(hdcmem,hBm); //选入内存句柄

BitBlt(hDC,60,iY,bm.bmWidth,bm.bmHeight,hdcmem,0,0,SRCCOPY);//输出位图

}

else if(iY<=0) //当位图的上边界超出了窗口时

{

TextOut(hDC,0,0,cUpWarn,sizeof(cUpWarn)); //输出警告

}

else //当位图的下边界超出了窗口时

{

TextOut(hDC,0,0,cDownWarn,sizeof(cDownWarn)); //输出警告

}

EndPaint(hWnd,&ps); //输出环境句柄

break;

case WM_DESTROY: //关闭窗口消息

DeleteObject(hBm); //删除内存句柄

PostQuitMessage(0);

return 0;

default:

return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

return 0;

}

BOOL InitWindows(HINSTANCE hInstance, int nCmdShow)

{

HWND hWnd;

hWnd=CreateWindow("BitmapInstance", //窗口类名称

"位图显示实例程序", //标题栏名称

WS_OVERLAPPEDWINDOW, //窗口样式

CW_USEDEFAULT, //窗口左上角坐标

0,

iWindowWidth, //采用自定义的高度和宽度

iWindowHeight,

NULL, //无父窗口

NULL, //无菜单

hInstance, //当前应用实例句柄

NULL); //指向传递给窗口的参数的指针

if(!hWnd) //创建失败

return FALSE;

hWndMain=hWnd; //给全局窗口句柄付值

ShowWindow(hWnd,nCmdShow); //显示窗口

UpdateWindow(hWnd); //刷新用户区

return TRUE;

}

BOOL InitWindowsClass(HINSTANCE hInstance)

{

WNDCLASS WndClass;

WndClass.cbClsExtra=0; //无窗口类扩展

WndClass.cbWndExtra=0; //无窗口实例扩展

WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH)); //背景为白色

WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); //光标为为箭头

WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //采用缺省图标

WndClass.hInstance=hInstance; //当前实例

WndClass.lpfnWndProc=WndProc; //消息处理函数

WndClass.lpszClassName="BitmapInstance"; //窗口类名称

WndClass.lpszMenuName="Menu"; //定义菜单为Menu

WndClass.style=0; //缺省窗口风格

return RegisterClass(&WndClass); //返回窗口注册值

}程序运行结果

 

 

三、实验结果

通过本次试验我掌握了各种资源的应用及资源应用的程序设计方法,熟悉了菜单资源,位图资源,对话框资源,以及图标资源的创建和应用过程。

原文地址:https://www.cnblogs.com/wangprince2017/p/9236016.html

时间: 2024-10-18 19:52:37

第七章 资源在Windows编程中的应用 P157 7-8的相关文章

windows编程中的数据类型

在windows编程中,有许多奇怪的数据类型,初学者不知道这些代表什么,下面就把一些数据类型列出如下: ATOM 原子(原子表中的一个字符串的参考) BOOL 布尔变量 BOOLEAN 布尔变量 BYTE 字节(8位) CCHAR Windows字符 CHAR Windows字符 COLORREF 红.绿.蓝(RGB)彩色值(32位) Const 变量,该变量的值在执行期间保持为常量 CRITICAL_SECTION 临界段对象 CTRYID 国名标识符 DLGPROC 指向一个对话框过程的指针

第七章解决二叉树的编程问题

第七章      解决二叉树的编程问题 二叉树是n(≥0)个有限元素的集合,该集合或者为空,或者由一个称为根的元素及两个不相交的,被称为左子树和右子树的二叉树组成.当集合为空时,称该二叉树为空二叉树,在二叉树中一个元素也称为一个结点. 二叉树是有序的,即将其左右子树颠倒,就成为另一个不同的二叉树. 结点的度,结点所拥有的子树的个数 叶结点,度为0的结点,也称为终端结点 分支节点,度不为0的结点,也称为非终端结点 孩子.兄弟.双亲结点,树中一个结点的子树的根节点称为这个结点的孩子.这个结点称为孩子

Windows编程中char*转LPCWSTR解决办法总结

Windows编程中经常涉及到的一个问题是字符串之间的转换,开发过程总是遇到编译器提示无法格式转换的问题,于是自己总结了几种解决办法. 1.通过T2W转换宏 char* szStr = "balabala"; CString str = CString(szStr); USES_CONVERSION; LPCWSTR wszClassName = new WCHAR[str.GetLength()+1]; wcscpy((LPTSTR)wszClassName,T2W((LPTSTR)

Windows 编程中恼人的各种字符以及字符指针类型

在Windows编程中,很容易见到这些数据类型:LPSTR,LPTSTR,LPCTSTR... 像很多童鞋一样,当初在学Windows编程的时候,对着些数据类型真的是丈二和尚,摸不着头脑,长时间不用就会想不起来.所以,下面就对此做一个总结. 首先,先来看一下ASCII编码和UNICODE编码的区别.下面是<Windows 程序设计>一书中对Unicode编码的说明: 简单地说,Unicode扩展自ASCII字符集.在严格的ASCII中,每个字符用7位表示,或者计算机上普遍使用的每字符有8位宽:

Windows编程中char*转LPCWSTR解决的方法总结

Windows编程中常常涉及到的一个问题是字符串之间的转换,开发过程总是遇到编译器提示无法格式转换的问题.于是自己总结了几种解决的方法. 1.通过T2W转换宏 char* szStr = "balabala"; CString str = CString(szStr); USES_CONVERSION; LPCWSTR wszClassName = new WCHAR[str.GetLength()+1]; wcscpy((LPTSTR)wszClassName,T2W((LPTSTR

Windows编程中的堆管理(过于底层,一般不用关心)

摘要: 本文主要对Windows内存管理中的堆管理技术进行讨论,并简要介绍了堆的创建.内存块的分配与再分配.堆的撤销以及new和delete操作符的使用等内容. 关键词: 堆:堆管理 1 引言 在大多数Windows应用程序设计中,都几乎不可避免的要对内存进行操作和管理.在进行大尺寸内存的动态分配时尤其显的重要.本文即主要对内存管理中的堆管理技术进行论述. 堆(Heap)实际是位于保留的虚拟地址空间中的一个区域.刚开始时,保留区域中的多数页面并没有被提交物理存储器.随着从堆中越来越多的进行内存分

windows编程中关于“关闭窗口无法退出进程”的解决方法

一般会出现如下两种情况 1.WinMain函数中,最后阶段接收消息队列循环中,调用的GetMessage函数参数提供错误 如: while (GetMessage(&msg,hwnd, 0, 0))       {         TranslateMessage(&msg);         DispatchMessage(&msg);     } 这个错误往往是由于程序员疏忽大意造成的,个别编译器使用时会有自动补全(提示)功能,会提示GetMessage函数的第二个参数是一个H

R in action读书笔记(6)-第七章:基本统计分析(中)

7.2 频数表和列联表 > library(vcd) > head(Arthritis) ID Treatment Sex Age Improved 1 57 Treated Male 27 Some 2 46 Treated Male 29 None 3 77 Treated Male 30 None 4 17 Treated Male 32 Marked 5 36 Treated Male 46 Marked 6 23 Treated Male 58 Marked 7.2.1 生成频数表

windows 编程中的常见bug

错误 1 :   error LNK2001: 无法解析的外部符号 [email protected]     解决办法:   ——>查看链接器->输入->附加依赖项,依照debug模式下修改(修改附加依赖项中多余的lib,确保依赖的Lib) 错误 2: error LNK1181: 无法打开输入文件“WinKillHook.lib” 解决办法:   ——>链接器中的输入选项