C语言回调函数Demo - Win32版
生活随笔
收集整理的這篇文章主要介紹了
C语言回调函数Demo - Win32版
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
回調函數:通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用于對該事件或條件進行響應。
#include <windows.h> #include "resource.h"LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);HINSTANCE hInst; TCHAR szClassName[] = TEXT("callbackDemo");typedef struct gfun{int (*pfun)(int); }gfun;int myfun(int , HDC );int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil) {HWND hwnd;MSG messages;WNDCLASSEX wincl;hInst = hThisInstance;wincl.hInstance = hThisInstance;wincl.lpszClassName = szClassName;wincl.lpfnWndProc = WindowProcedure;wincl.style = CS_DBLCLKS;wincl.cbSize = sizeof (WNDCLASSEX);wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);wincl.hCursor = LoadCursor (NULL, IDC_ARROW);wincl.lpszMenuName = MAKEINTRESOURCE (IDC_CALLBACKDEMO);wincl.cbClsExtra = 0;wincl.cbWndExtra = 0;wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);if (!RegisterClassEx (&wincl))return 0;hwnd = CreateWindowEx (0,szClassName,TEXT("C 回調函數Demo"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,300,200,HWND_DESKTOP,NULL,hThisInstance,NULL);ShowWindow (hwnd, nFunsterStil);while (GetMessage (&messages, NULL, 0, 0)){TranslateMessage(&messages);DispatchMessage(&messages);}return messages.wParam; }LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {PAINTSTRUCT ps;HDC hdc;RECT rt; char szBuffer[100]; int ret;gfun gf;switch (message){case WM_COMMAND:switch (LOWORD(wParam)){case IDM_callback: hdc=GetDC(hwnd);gf.pfun = myfun;ret = rt_data(100,gf.pfun,hdc);wsprintf(szBuffer, "return data:%d",ret);TextOut(hdc,100,100,szBuffer,lstrlen(szBuffer));break;case IDM_ABOUT:MessageBox (hwnd, TEXT ("callbackDemo v1.0\nCopyright (C) 2020\n by bo"),TEXT ("callbackDemo"), MB_OK | MB_ICONINFORMATION);break;case IDM_EXIT:DestroyWindow(hwnd);break;default:return DefWindowProc(hwnd, message, wParam, lParam); }break;case WM_CREATE:break;case WM_PAINT:hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rt); EndPaint(hwnd, &ps);break;case WM_DESTROY:PostQuitMessage (0);break;default:return DefWindowProc (hwnd, message, wParam, lParam);}return 0; }int myfun(int data, HDC hdc) {char szBuffer[100]; wsprintf(szBuffer, "get data:%d",data);TextOut(hdc,100,50,szBuffer,lstrlen(szBuffer));return (data*2); } int rt_data(int data,int (*tr_fun)(), HDC hdc) {return ((*tr_fun)(data,hdc)); }運行如下;
將結構體中的函數指針指向了myfun函數地址,在回調函數中將函數指針gf.pfun作為rt_data(int data,int (*tr_fun)())函數的參數即為int (*tr_fun)();回調函數中的return (*tr_fun)(data)相當于對指針進行了簡引用,返回這個指針指向地址的內容值。
回調函數的意義
可以把調用者與被調用者分開,所以調用者不關心誰是被調用者。它只需知道存在一個具有特定原型和限制條件的被調用函數。
回調可用于通知機制。
用戶和開發者之間的概念;用戶是實現myfun這個函數,開發者是實現rt_data函數,根據需求用戶將myfun函數以參數的形式傳入開發者的rt_data函數中,rt_data函數就能返回給相應的數據給用戶,開發者不用告訴用戶它實現了什么,用戶也并不知道開發者怎么實現,用戶只用傳入自己的函數,便可以得到開發者實現的函數返回值,開發者可以將內容封裝起來,將頭文件以及庫文件提供給用戶。
工程;
資源和頭文件;
#include "resource.h" #include <windows.h>/ // // Menu //IDC_CALLBACKDEMO MENU BEGINPOPUP "&File"BEGINMENUITEM "回調函數Demo", IDM_callbackMENUITEM "E&xit", IDM_EXITENDPOPUP "&Help"BEGINMENUITEM "&About ...", IDM_ABOUTEND END #define IDM_EXIT 10001 #define IDM_ABOUT 10002#define IDC_CALLBACKDEMO 10101 #define IDD_ABOUTBOX 10102 #define IDM_callback 40001?
總結
以上是生活随笔為你收集整理的C语言回调函数Demo - Win32版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL 列转行、行转列 - 使用sqli
- 下一篇: C++ 异常处理Demo - win32