本文是截图:Windows编程基础 第八章 位图 坐标系映射模式 文字和字体 对话框
原文pdf文件下载地址是:http://yunpan.cn/cdeWFvDiwZeMy 访问密码 a9de
//程序用来演示位图的加载和使用
#include "stdafx.h"
#include "resource.h"
#include "windows11.h"
HINSTANCE g_hInst = NULL;
int g_type=-1;
void DrawBmp( HDC hDC )
{ //加载位图资源
HBITMAP hBmp = LoadBitmap( g_hInst,
MAKEINTRESOURCE(IDB_BITMAP1) );
//获取位图的相关信息
BITMAP bmpInfo = { 0 };
GetObject( hBmp, sizeof(bmpInfo), &bmpInfo );
//创建放置位图的DC
HDC hBmpDC = CreateCompatibleDC( hDC );
//将位图放入hBmpDC
HBITMAP hOldBmp = (HBITMAP)
SelectObject( hBmpDC, hBmp );
//绘制位图
BitBlt( hDC, 100, 100, bmpInfo.bmWidth,
bmpInfo.bmHeight, hBmpDC,
0, 0, SRCCOPY );
//取出位图
SelectObject( hBmpDC, hOldBmp );
//删除DC
DeleteDC( hBmpDC );
//删除位图
DeleteObject( hBmp );
}
void DrawBmpStretch( HDC hDC )
{ //加载位图资源
HBITMAP hBmp = LoadBitmap( g_hInst,
MAKEINTRESOURCE(IDB_BITMAP1) );
//获取位图的相关信息
BITMAP bmpInfo = { 0 };
GetObject( hBmp, sizeof(bmpInfo), &bmpInfo );
//创建放置位图的DC
HDC hBmpDC = CreateCompatibleDC( hDC );
//将位图放入hBmpDC
HBITMAP hOldBmp = (HBITMAP)
SelectObject( hBmpDC, hBmp );
//拉伸绘制
StretchBlt( hDC, 200, 100, 300, 300,
hBmpDC, 0, 0, bmpInfo.bmWidth,
bmpInfo.bmHeight, SRCCOPY );
//取出位图
SelectObject( hBmpDC, hOldBmp );
//删除DC
DeleteDC( hBmpDC );
//删除位图
DeleteObject( hBmp );
}
void OnPaint( HWND hWnd, UINT nMsg,
WPARAM wParam, LPARAM lParam )
{
PAINTSTRUCT ps = { 0 };
HDC hDC = BeginPaint( hWnd, &ps );
if (g_type==0)
{
DrawBmp(hDC);
}
else
if(g_type==1)
{
DrawBmpStretch(hDC);
}
EndPaint( hWnd, &ps );
}
VOID OnCommand( HWND hWnd, UINT nMsg,WPARAM wParam, LPARAM lParam )
{
int nCmd=LOWORD(wParam);
switch(nCmd)
{
case ID_32771:
g_type=0;
InvalidateRect(hWnd,NULL,TRUE);
break;
case ID_32772:
g_type=1;
InvalidateRect(hWnd,NULL,TRUE);
break;
case IDM_EXIT:
PostQuitMessage(0);
break;
}
}
LRESULT CALLBACK WndProc( HWND hWnd,
UINT nMsg,
WPARAM wParam,
LPARAM lParam )
{
switch( nMsg )
{
case WM_PAINT:
OnPaint( hWnd, nMsg, wParam, lParam );
break;
case WM_DESTROY:
PostQuitMessage( 0 );
return 0;
case WM_COMMAND:
OnCommand(hWnd,nMsg,wParam,lParam);
break;
}
return DefWindowProc( hWnd, nMsg,
wParam, lParam );
}
BOOL RegisterWnd( TCHAR * pszClassName )
{
WNDCLASSEX wce = { 0 };
wce.cbSize = sizeof( wce );
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.hbrBackground = HBRUSH(COLOR_WINDOW);
wce.hCursor = NULL;
wce.hIcon = NULL;
wce.hIconSm = NULL;
wce.hInstance = g_hInst;
wce.lpfnWndProc = WndProc;
wce.lpszClassName = pszClassName;
wce.lpszMenuName = NULL;
wce.style = CS_HREDRAW|CS_VREDRAW;
ATOM nAtom = RegisterClassEx( &wce );
if( 0 == nAtom )
{
return FALSE;
}
return TRUE;
}
HWND CreateWnd( TCHAR * pszClassName )
{
HMENU hMenu =
LoadMenu( g_hInst, MAKEINTRESOURCE(IDC_WINDOWS11) );
HWND hWnd = CreateWindowEx( 0,
pszClassName, L"MyWnd",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, NULL, hMenu, g_hInst,
NULL );
return hWnd;
}
void DisplayWnd( HWND hWnd )
{
ShowWindow( hWnd, SW_SHOW );
UpdateWindow( hWnd );
}
void Message( )
{
MSG msg = { 0 };
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
g_hInst = hInstance;
RegisterWnd(L"MYWND" );
HWND hWnd = CreateWnd(L"MYWND" );
DisplayWnd( hWnd );
Message( );
return 0;
}
//本程序用来演示坐标映射和字体
#include "windows12.h"
#include "stdafx.h"
#include "resource.h"
#include "stdio.h"
#include "windows.h"
HINSTANCE g_hInst=NULL;
VOID OnCommand(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
int nCmd=LOWORD(wParam);//取得菜单项ID
switch(nCmd)
{
case IDM_EXIT:
PostQuitMessage(0);
break;
}
}
/*
//这个Onpaint()函数用来演示坐标的映射
VOID OnPaint(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps={0};
HDC hDC=BeginPaint(hWnd,&ps);
Rectangle(hDC,100,100,200,200);
int OldMapMethod =SetMapMode(hDC,MM_LOMETRIC);
Rectangle(hDC,300,-300,200,-200);
SetMapMode(hDC,MM_HIMETRIC);
Rectangle(hDC,100,-300,200,-200);
SetMapMode(hDC,OldMapMethod);
Rectangle(hDC,100,300,200,200);
SetViewportExtEx(hDC,6,6,NULL);
SetWindowExtEx(hDC,2,2,NULL);
Rectangle(hDC,300,300,400,400);
EndPaint(hWnd,&ps);
}
*/
//这个OnPaint()函数用来演示字体的使用
VOID OnPaint(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps={0};
HDC hDC=BeginPaint(hWnd,&ps);
//设置文字颜色
COLORREF nColor=SetTextColor(hDC,RGB(255,0,0));
//设置背景颜色
SetBkColor(hDC,RGB(0,255,255));
//创建字体
HFONT hFont=CreateFont(300,30,100,0,FW_BLACK,TRUE,TRUE,TRUE,DEFAULT_CHARSET,0,0,0,0,TEXT("宋体"));
//把字加入到DC中
HFONT hOldFont=(HFONT)SelectObject(hDC,hFont);
//输出文字
TCHAR szText1[100]=TEXT("hello text,long long long long ");
TextOut(hDC,100,100,szText1,_tcslen(szText1));
//设置背景模式
SetBkMode(hDC,TRANSPARENT);
RECT rect={0};
rect.left=500;
rect.top=520;
rect.right=700;
rect.bottom=700;
Rectangle(hDC,rect.left,rect.top,rect.right,rect.bottom);
DrawText(hDC,szText1,_tcslen(szText1),&rect,DT_CENTER|DT_WORDBREAK);
TCHAR szText[100]=TEXT("E你xtTex好!");
INT nText[10]={30,0,10,100,50,60,70,80,80,80};
ExtTextOut(hDC,500,500,ETO_OPAQUE,NULL,szText,_tcslen(szText),NULL);
SetTextColor(hDC,nColor);
SelectObject(hDC,hOldFont);
DeleteObject(hFont);
EndPaint(hWnd,&ps);
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_COMMAND://用来处理菜单消息
OnCommand(hWnd,uMsg,wParam,lParam);
break;
case WM_PAINT:
OnPaint(hWnd,uMsg,wParam,lParam);
break;
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
BOOL RegisterWnd(TCHAR * pszClassName )
{
WNDCLASSEX wce={0};
wce.cbClsExtra=0;
wce.cbSize=sizeof(wce);
wce.cbWndExtra=0;
wce.hbrBackground=HBRUSH(COLOR_WINDOW+1);//GetStockBrush(WHITE_BRUSH);
wce.hCursor=NULL;
wce.hIcon=NULL;
wce.hIconSm=NULL;
wce.hInstance=g_hInst;
wce.lpfnWndProc=WndProc;
wce.lpszClassName=pszClassName;
wce.lpszMenuName=NULL;
wce.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
ATOM result=RegisterClassEx(&wce);
if (result==0)
{
MessageBox(NULL,TEXT("窗口类注册失败!"),TEXT("窗口类注册失败!"),MB_OK);
return FALSE;
}
return TRUE;
}
VOID DisplayWindow(HWND hWnd)
{
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
}
VOID Message(HWND hWnd)
{
HACCEL hAccel=LoadAccelerators(g_hInst,MAKEINTRESOURCE(IDC_WINDOWS12));
MSG msg={0};
while(GetMessage(&msg,NULL,0,0))
{
TranslateAccelerator(hWnd,hAccel,&msg);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
HWND CreateMyWindow(TCHAR * pszClassName)
{
//加载字符串资源
TCHAR szText[100]=TEXT("");
LoadString(g_hInst,IDS_STRINGMain,szText,100);
//加载菜单资源
HMENU hMenu=LoadMenu(g_hInst,MAKEINTRESOURCE(IDC_WINDOWS12));
HWND hWndNew=CreateWindowEx(0,pszClassName,szText,WS_OVERLAPPEDWINDOW|WS_THICKFRAME,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,hMenu,g_hInst,NULL);
return hWndNew;
}
INT WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd )
{
RegisterWnd(TEXT("MyWnd"));
HWND hWnd=CreateMyWindow(TEXT("MyWnd"));
DisplayWindow(hWnd);
Message(hWnd);
return TRUE;
}
//本程序用来演示一个有模式对话框的创建和关闭
#include "windows12.h"
#include "stdafx.h"
#include "resource.h"
#include "stdio.h"
#include "windows.h"
HINSTANCE g_hInst=NULL;
BOOL CALLBACK DialogProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_SYSCOMMAND:
switch(wParam)
{
case SC_CLOSE:
EndDialog(hWnd,1);
break;
}
}
return 0;
}
VOID setting(HWND hWnd)
{
int result=DialogBox(g_hInst,MAKEINTRESOURCE(IDD_DIALOG1),hWnd,DialogProc);
if (result==1)
{
MessageBox(NULL,TEXT("应用设置"),TEXT("设置"),MB_OK);
}
else
{
MessageBox(NULL,TEXT("取消设置"),TEXT("设置"),MB_OK);
}
}
VOID OnCommand(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
int nCmd=LOWORD(wParam);//取得菜单项ID
switch(nCmd)
{
case IDM_EXIT:
PostQuitMessage(0);
break;
case ID_DIALOGBOX:
setting(hWnd);
break;
}
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_COMMAND://用来处理菜单消息
OnCommand(hWnd,uMsg,wParam,lParam);
break;
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
BOOL RegisterWnd(TCHAR * pszClassName )
{
WNDCLASSEX wce={0};
wce.cbClsExtra=0;
wce.cbSize=sizeof(wce);
wce.cbWndExtra=0;
wce.hbrBackground=HBRUSH(COLOR_WINDOW+1);//GetStockBrush(WHITE_BRUSH);
wce.hCursor=NULL;
wce.hIcon=NULL;
wce.hIconSm=NULL;
wce.hInstance=g_hInst;
wce.lpfnWndProc=WndProc;
wce.lpszClassName=pszClassName;
wce.lpszMenuName=NULL;
wce.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
ATOM result=RegisterClassEx(&wce);
if (result==0)
{
MessageBox(NULL,TEXT("窗口类注册失败!"),TEXT("窗口类注册失败!"),MB_OK);
return FALSE;
}
return TRUE;
}
VOID DisplayWindow(HWND hWnd)
{
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
}
VOID Message(HWND hWnd)
{
HACCEL hAccel=LoadAccelerators(g_hInst,MAKEINTRESOURCE(IDC_WINDOWS12));
MSG msg={0};
while(GetMessage(&msg,NULL,0,0))
{
TranslateAccelerator(hWnd,hAccel,&msg);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
HWND CreateMyWindow(TCHAR * pszClassName)
{
//加载字符串资源
TCHAR szText[100]=TEXT("");
LoadString(g_hInst,IDS_STRINGMain,szText,100);
//加载菜单资源
HMENU hMenu=LoadMenu(g_hInst,MAKEINTRESOURCE(IDC_WINDOWS12));
HWND hWndNew=CreateWindowEx(0,pszClassName,szText,WS_OVERLAPPEDWINDOW|WS_THICKFRAME,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,hMenu,g_hInst,NULL);
return hWndNew;
}
INT WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd )
{
RegisterWnd(TEXT("MyWnd"));
HWND hWnd=CreateMyWindow(TEXT("MyWnd"));
DisplayWindow(hWnd);
Message(hWnd);
return TRUE;
}