C++:Win32 桌面应用程序
如果要建立视窗应用程序,必需调用WINDOWS操作系统的编程接口,因此,我们建立一个常用的API库及相应的实例。以便快捷入门。
C++ Win32 桌面应用程序的代码示例:(来源于 DEV-C++5.11 -文件 - 新建 - 项目 - Win32 - File Editor - C++ )
// main.h
#define CM_FILE_SAVEAS 9072
#define CM_FILE_EXIT 9071
#define CM_FILE_OPEN 9070
#define CM_ABOUT 9069
#define IDC_MAIN_TEXT 1001
// resource.rc
#include "main.h"
MAINMENU MENU
{
POPUP "&File"
{
MENUITEM "&Open...", CM_FILE_OPEN
MENUITEM "Save &As...", CM_FILE_SAVEAS
MENUITEM SEPARATOR
MENUITEM "E&xit", CM_FILE_EXIT
}
POPUP "&Help"
{
MENUITEM "&About", CM_ABOUT
}
}#include <windows.h>
#include "main.h"
/////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL LoadFile(HWND hEdit, LPSTR pszFileName)
{
HANDLE hFile;
BOOL bSuccess = FALSE;
hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
if(hFile != INVALID_HANDLE_VALUE)
{
DWORD dwFileSize;
dwFileSize = GetFileSize(hFile, NULL);
if(dwFileSize != 0xFFFFFFFF)
{
LPSTR pszFileText;
pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1);
if(pszFileText != NULL)
{
DWORD dwRead;
if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL))
{
pszFileText[dwFileSize] = 0; // Null terminator
if(SetWindowText(hEdit, pszFileText))
bSuccess = TRUE; // It worked!
}
GlobalFree(pszFileText);
}
}
CloseHandle(hFile);
}
return bSuccess;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL SaveFile(HWND hEdit, LPSTR pszFileName)
{
HANDLE hFile;
BOOL bSuccess = FALSE;
hFile = CreateFile(pszFileName, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if(hFile != INVALID_HANDLE_VALUE)
{
DWORD dwTextLength;
dwTextLength = GetWindowTextLength(hEdit);
if(dwTextLength > 0)
{
LPSTR pszText;
pszText = (LPSTR)GlobalAlloc(GPTR, dwTextLength + 1);
if(pszText != NULL)
{
if(GetWindowText(hEdit, pszText, dwTextLength + 1))
{
DWORD dwWritten;
if(WriteFile(hFile, pszText, dwTextLength, &dwWritten, NULL))
bSuccess = TRUE;
}
GlobalFree(pszText);
}
}
CloseHandle(hFile);
}
return bSuccess;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL DoFileOpenSave(HWND hwnd, BOOL bSave)
{
OPENFILENAME ofn;
char szFileName[MAX_PATH];
ZeroMemory(&ofn, sizeof(ofn));
szFileName[0] = 0;
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = "Text Files (*.txt)/0*.txt";
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrDefExt = "txt";
if(bSave)
{
ofn.Flags = OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT;
if(GetSaveFileName(&ofn))
{
if(!SaveFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName))
{
MessageBox(hwnd, "Save file failed.", "Error",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
}
} else {
ofn.Flags = OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;
if(GetOpenFileName(&ofn))
{
if(!LoadFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName))
{
MessageBox(hwnd, "Load of file failed.", "Error",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
}
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch(Message)
{
case WM_CREATE:
CreateWindow("EDIT", "",WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|
ES_MULTILINE|ES_WANTRETURN,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
hwnd,
(HMENU)IDC_MAIN_TEXT,
GetModuleHandle(NULL),
NULL);
SendDlgItemMessage(hwnd, IDC_MAIN_TEXT,
WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),
MAKELPARAM(TRUE,0));
break;
case WM_SIZE:
if(wParam != SIZE_MINIMIZED)
MoveWindow(GetDlgItem(hwnd, IDC_MAIN_TEXT), 0, 0,
LOWORD(lParam),HIWORD(lParam), TRUE);
break;
case WM_SETFOCUS:
SetFocus(GetDlgItem(hwnd, IDC_MAIN_TEXT));
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case CM_FILE_OPEN:
DoFileOpenSave(hwnd, FALSE);
break;
case CM_FILE_SAVEAS:
DoFileOpenSave(hwnd, TRUE);
break;
case CM_FILE_EXIT:
PostMessage(hwnd, WM_CLOSE, 0, 0);
break;
case CM_ABOUT:
MessageBox (NULL, "Created using the Win32 API" ,
"About...", 0);
break;
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, Message, wParam, lParam);
}
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = "MAINMENU";
wc.lpszClassName = "WindowClass";
wc.hIconSm = LoadIcon(hInstance,"A"); /* A is name used by project icons */
if(!RegisterClassEx(&wc))
{
MessageBox(0,"Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK|MB_SYSTEMMODAL);
return 0;
}
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","File Editor Example Program",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
320,240,
NULL, NULL, hInstance, NULL);
if(hwnd == NULL)
{
MessageBox(0, "Window Creation Failed!", "Error!",MB_ICONEXCLAMATION|MB_OK|MB_SYSTEMMODAL);
return 0;
}
ShowWindow(hwnd,1);
UpdateWindow(hwnd);
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}这个示例创建了一个简单的窗口,当窗口需要重绘时(例如窗口被移动、调整大小或首次显示时),会调用`WM_PAINT`消息处理函数,在这个函数中你可以进行绘图操作。当用户关闭窗口时,会发送`WM_DESTROY`消息,导致程序退出消息循环并结束。
C++编程API库
- C++:API(仅展示平时要用的)
- C++:Win32 桌面应用程序
- C++:WinMain()函数
- C++:WNDCLASSEX 窗口类结构体
- C++:LoadIcon()函数
- C++:LoadCursor()函数
- C++:RegisterClassEx()函数
- C++:CreateWindowEx()函数
- C++:ShowWindow()函数
- C++:UpdateWindow()函数
- C++:GetMessage()函数
- C++:MSG 消息结构体
- C++:TranslateMessage()函数
- C++:DispatchMessage()函数
- C++:WndProc()窗口过程函数
- C++:GetModuleHandle()函数
- C++:DestroyWindow()函数
- C++:DefWindowProc()函数
- C++:SendMessage()发送消息函数
- C++:FindWindow()函数
- C++:FindWindowEx()函数
- C++:EnumWindows()函数
- C++:EnumWindowsProc()函数
- C++:GetWindowText()函数
- C++:SetWindowText()函数
- C++:GetDlgltem()取控件句柄函数
- C++:GetDlgCtrllD()取控件ID函数
- C++:GetDlgltemText()取对话框控件文本函数
- C++:SetDlgltemText()设置对话框控件文本函数
- C++:GetDlgltemlnt()取对话框控件整数函数
- C++:SetDlgltemlnt()设置对话框控件的整数值函数
- C++:DialogBox()模态对话框函数
- C++:DialogBoxParam()创建模态对话框函数
- C++:MessageBox()显示消息框函数
- C++:DefDlgProc()对话框过程函数
- C++:MessageBoxIndirect()显示消息框函数
- C++:EndDialog()结束模态对话框函数
- C++:OpenClipboard()打开剪贴板函数
- C++:GetClipboardData()获取剪贴板数据函数
- C++:SetClipboardData()设置剪贴板数据函数
