c语言 图片按钮winapi,一个简单的实现显示指定图片功能的WinAPI程序

///一个简单的 WinAPI程序,

///实现功能:

///创建一个窗口,并在窗口上双击鼠标左键,以打开一个指定的图片文件,并在窗口上显示该图片。

///

#include // Windows SDK 要用到的

#include // 打开文件的窗口要包含这个头文件

//用到了 IPicture 接口,要包含下面两个 头文件

#include

#include

// 声明窗口函数的原型

LRESULT CALLBACK MainWndProc (HWND, UINT, WPARAM,

LPARAM);

// 声明显示图片的函数原型

HRESULT ShowPic(char *lpstrFile,HWND hWnd) ;

//图片文件名

char lpstrFile[MAX_PATH]="";

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

// 窗口类名

char szClassName[ ] = "ShowPicture";

WNDCLASSEX windclass;

//用描述主窗口的参数填充 WNDCLASSEX 结构

windclass.cbSize = sizeof(windclass); //结构大小

windclass.hInstance = hThisInstance; //实例句酚

windclass.lpszClassName = szClassName;

windclass.lpfnWndProc = MainWndProc; //窗口函数指针

windclass.style = CS_DBLCLKS; //捕获双击事件

windclass.cbSize = sizeof (WNDCLASSEX);

windclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);

//使用预定义图标

windclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);

//使用预定义类的小图标

windclass.hCursor = LoadCursor (NULL, IDC_ARROW);

//使用预定义光标

windclass.lpszMenuName = NULL; //不指定主菜单

windclass.cbClsExtra = 0; //没有额外的类内存

windclass.cbWndExtra = 0; //没有额外的窗口内存

windclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

//使用预定义背景画刷

//注册这个窗口类,如果失败直接退出程序

if (!RegisterClassEx (&windclass))

return 0;

//创建主窗口

HWND hWnd = CreateWindowEx (

0, //dwExStyle, 扩展样式

szClassName, //lpClassName, 类名

"鼠标双击打开指定图片", //lpWindowName, 窗口标题

WS_OVERLAPPEDWINDOW, //dwStyle, 窗口风格

CW_USEDEFAULT, //X, 初始 X 坐标

CW_USEDEFAULT, //Y, 初始 YX 坐标

640, //nWidth, 宽度

480, //nHeight, 高度

HWND_DESKTOP, //hWndParent, 父窗口句柄

NULL, //hMenu, 菜单句柄

hThisInstance, //hInstance, 程序实例句柄

NULL //lpParam, 用户数据

);

//显示窗口,刷新窗口客户区

ShowWindow (hWnd, nFunsterStil);

// 从消息队列中取出消息,交给窗口函数处理

// 直到 GetMessage 取出的消息是 WM_QUIT,即FALSE,则结束消息循环

MSG messages;

while (GetMessage (&messages, NULL, 0, 0))

{

//转换键盘消息,把虚拟键转换为字符消息

TranslateMessage(&messages);

//将消息发送到相应的窗口函数

DispatchMessage(&messages);

}

// GetMessage 返回 FALSE,程序结束 PostQuitMessage() 发出这一消息

return messages.wParam;

}

// 窗口函数,消息由 DispatchMessage 派发

LRESULT CALLBACK MainWndProc (HWND hWnd, UINT message, WPARAM

wParam, LPARAM lParam)

{

switch (message) //处理消息

{

case WM_DESTROY:

//向消息队列投递一个 WM_QUIT 消息,促使 GetMessage 函数返回0,结束消息循环

PostQuitMessage (0);

break;

case WM_LBUTTONDBLCLK:

{

OPENFILENAME file = {0};

file.lStructSize = sizeof(file);

file.lpstrTitle = "请选择一个图片文件";

file.lpstrFile = lpstrFile;

file.nMaxFile = MAX_PATH;

file.lpstrFilter =

"Pictures(*.jpg,*.gif,*.bmp)*.jpg;*.gif;*.bmp";

if(::GetOpenFileName(&file))

{

//清除原来的图像

HDC hdc=GetDC(hWnd);

RECT rect;

::GetWindowRect(hWnd,&rect);

::FillRect(hdc,&rect,(HBRUSH) COLOR_BACKGROUND);

::SendMessage(hWnd,WM_PAINT,NULL,NULL);

}

}

break;

case WM_PAINT:

ShowPic(lpstrFile,hWnd);

break;

default:

//将我们不处理的消息交给系统 做默认处理

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

}

return 0;

}

// 显示图片,此文的重点之所在了, lpstrFile 为图片文件名,hWnd 为窗口句柄

HRESULT ShowPic(char *lpstrFile,HWND hWnd)

{

HDC hDC_Temp=GetDC(hWnd);

IPicture *pPic;

IStream *pStm;

BOOL bResult;

HANDLE hFile=NULL;

DWORD dwFileSize,dwByteRead;

//打开图形文件

hFile=CreateFile(lpstrFile,GENERIC_READ,

FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if (hFile!=INVALID_HANDLE_VALUE)

{

dwFileSize=GetFileSize(hFile,NULL);//获取文件字节数

if (dwFileSize==0xFFFFFFFF)

return E_FAIL;

}

else

{

return E_FAIL;

}

//分配全局存储空间

HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE,

dwFileSize);

LPVOID pvData = NULL;

if (hGlobal == NULL)

return E_FAIL;

if ((pvData = GlobalLock(hGlobal)) == NULL)//锁定分配内存块

return E_FAIL;

ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件读入内存缓冲区

GlobalUnlock(hGlobal);

CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);

//装入图形文件

bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);

if(FAILED(bResult))

return E_FAIL;

OLE_XSIZE_HIMETRIC hmWidth; //图片的真实宽度, 单位为英寸

OLE_YSIZE_HIMETRIC hmHeight; //图片的真实高度, 单位为英寸

pPic->get_Width(&hmWidth);

pPic->get_Height(&hmHeight);

//转换hmWidth和hmHeight为pixels距离,1英寸=25.4毫米

int nWidth =

MulDiv(hmWidth,GetDeviceCaps(hDC_Temp,LOGPIXELSX),2540);

int nHeight =

MulDiv(hmHeight,GetDeviceCaps(hDC_Temp,LOGPIXELSY),2540);

//将图形输出到屏幕上(有点像BitBlt)

bResult=pPic->Render(hDC_Temp,0,0,nWidth,nHeight,

0,hmHeight,hmWidth,-hmHeight,NULL);

pPic->Release();

CloseHandle(hFile);//关闭打开的文件

if (SUCCEEDED(bResult))

{

return S_OK;

}

else

{

return E_FAIL;

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个问题需要更多的上下文和细节才能回答。以下是一个简单的示例,在Windows下使用C语言WinAPI编写一个具有两个按钮程序一个按钮将打开另一个程序。 ```c #include <windows.h> #define ID_BUTTON_ONE 1 #define ID_BUTTON_TWO 2 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // Register the window class. const char CLASS_NAME[] = "Sample Window Class"; WNDCLASS wc = {0}; wc.lpfnWndProc = WindowProc; wc.hInstance = hInstance; wc.lpszClassName = CLASS_NAME; RegisterClass(&wc); // Create the window. HWND hwnd = CreateWindowEx( 0, // Optional window styles. CLASS_NAME, // Window class "Button Sample", // Window text WS_OVERLAPPEDWINDOW, // Window style // Size and position CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, // Parent window NULL, // Menu hInstance, // Instance handle NULL // Additional application data ); if (hwnd == NULL) { return 0; } // Create the first button. HWND hwndButton1 = CreateWindow( "BUTTON", // Button class "Open Another Program", // Button text WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // Button style 10, // X position 10, // Y position 200, // Width 50, // Height hwnd, // Parent window (HMENU)ID_BUTTON_ONE, // Button identifier hInstance, // Instance handle NULL // No additional parameters ); // Create the second button. HWND hwndButton2 = CreateWindow( "BUTTON", // Button class "Exit", // Button text WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // Button style 10, // X position 70, // Y position 200, // Width 50, // Height hwnd, // Parent window (HMENU)ID_BUTTON_TWO, // Button identifier hInstance, // Instance handle NULL // No additional parameters ); // Run the message loop. MSG msg = {0}; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_COMMAND: { switch (LOWORD(wParam)) { case ID_BUTTON_ONE: // Run the other program. ShellExecute(NULL, "open", "C:\\path\\to\\program.exe", NULL, NULL, SW_SHOWNORMAL); break; case ID_BUTTON_TWO: // Exit the program. DestroyWindow(hwnd); break; } break; } case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; } ``` 这个示例中,我们创建了两个按钮。第一个按钮将打开另一个程序,第二个按钮将退出程序。当用户单击按钮时,将发送 `WM_COMMAND` 消息,我们可以捕获这个消息并根据按钮的ID执行相应的操作。在这个示例中,我们使用 `ShellExecute` 函数来打开另一个程序。 请注意,这只是一个简单的示例,仅用于展示如何创建具有按钮的窗口,并捕获按钮单击事件。实际上,实现程序之间的跳转需要更多的逻辑和代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值