⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ddepop1.c

📁 ProgrammingWindowSourceCode
💻 C
📖 第 1 页 / 共 2 页
字号:
/*---------------------------------------------
   DDEPOP1.C -- DDE Server for Population Data
                (c) Charles Petzold, 1996
  ---------------------------------------------*/

#include <windows.h>
#include <dde.h>
#include <string.h>
#include "ddepop.h"

typedef struct
     {
     unsigned int fAdvise:1 ;
     unsigned int fDeferUpd:1 ;
     unsigned int fAckReq:1 ;
     unsigned int dummy:13 ;
     long         lPopPrev ;
     }
     POPADVISE ;

#define ID_TIMER    1
#define DDE_TIMEOUT 3000

LRESULT CALLBACK WndProc         (HWND, UINT, WPARAM, LPARAM) ;
LRESULT CALLBACK ServerProc      (HWND, UINT, WPARAM, LPARAM) ;
BOOL    CALLBACK TimerEnumProc   (HWND, LONG) ;
BOOL    CALLBACK CloseEnumProc   (HWND, LONG) ;
BOOL             PostDataMessage (HWND, HWND, int, BOOL, BOOL, BOOL) ;

char      szAppName[]     = "DdePop1" ;
char      szServerClass[] = "DdePop1.Server" ;
HINSTANCE hInst ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
     {
     HWND        hwnd ;
     MSG         msg ;
     WNDCLASSEX  wndclass ;

     hInst = hInstance ;

               // Register window class

     wndclass.cbSize        = sizeof (wndclass) ;
     wndclass.style         = 0 ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (hInstance, szAppName) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;
     wndclass.hIconSm       = LoadIcon (hInstance, szAppName) ;

     RegisterClassEx (&wndclass) ;

               // Register window class for DDE Server

     wndclass.cbSize        = sizeof (wndclass) ;
     wndclass.style         = 0 ;
     wndclass.lpfnWndProc   = ServerProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 2 * sizeof (DWORD) ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = NULL ;
     wndclass.hCursor       = NULL ;
     wndclass.hbrBackground = NULL ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szServerClass ;
     wndclass.hIconSm       = NULL ;

     RegisterClassEx (&wndclass) ;

     hwnd = CreateWindow (szAppName, "DDE Population Server",
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          NULL, NULL, hInstance, NULL) ;

     InitPops () ;                      // initialize 'pop' structure

     SetTimer (hwnd, ID_TIMER, 5000, NULL) ;

     ShowWindow (hwnd, SW_SHOWMINNOACTIVE) ;
     UpdateWindow (hwnd) ;

     while (GetMessage (&msg, NULL, 0, 0))
          {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
          }

     KillTimer (hwnd, ID_TIMER) ;

     return msg.wParam ;
     }

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
     {
     static char szTopic[] = "US_Population" ;
     ATOM        aApp, aTop ;
     HWND        hwndClient, hwndServer ;

     switch (iMsg)
          {
          case WM_DDE_INITIATE :

                    // wParam          -- sending window handle
                    // LOWORD (lParam) -- application atom
                    // HIWORD (lParam) -- topic atom

               hwndClient = (HWND) wParam ;

               aApp = GlobalAddAtom (szAppName) ;
               aTop = GlobalAddAtom (szTopic) ;

                    // Check for matching atoms, create window, and acknowledge

               if ((LOWORD (lParam) == NULL || LOWORD (lParam) == aApp) &&
                   (HIWORD (lParam) == NULL || HIWORD (lParam) == aTop))
                    {
                    hwndServer = CreateWindow (szServerClass, NULL,
                                               WS_CHILD, 0, 0, 0, 0,
                                               hwnd, NULL, hInst, NULL) ;

                    SetWindowLong (hwndServer, 0, (LONG) hwndClient) ;
                    SendMessage ((HWND) wParam, WM_DDE_ACK,
                                 (WPARAM) hwndServer,
                                 MAKELPARAM (aApp, aTop)) ;
                    }

                    // Otherwise, delete the atoms just created

               else
                    {
                    GlobalDeleteAtom (aApp) ;
                    GlobalDeleteAtom (aTop) ;
                    }

               return 0 ;

          case WM_TIMER :
          case WM_TIMECHANGE :

                    // Calculate new current populations

               CalcPops () ;

                    // Notify all child windows

               EnumChildWindows (hwnd, &TimerEnumProc, 0L) ;
               return 0 ;

          case WM_QUERYOPEN :
               return 0 ;

          case WM_CLOSE :

                    // Notify all child windows

               EnumChildWindows (hwnd, &CloseEnumProc, 0L) ;

               break ;                  // for default processing

          case WM_DESTROY :
               PostQuitMessage (0) ;
               return 0 ;
          }
     return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
     }

LRESULT CALLBACK ServerProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
     {
     ATOM          aItem ;
     char          szItem[10] ;
     DDEACK        DdeAck ;
     DDEADVISE    *pDdeAdvise ;
     DWORD         dwTime ;
     GLOBALHANDLE  hPopAdvise, hDdeAdvise, hCommands, hDdePoke ;
     int           i ;
     UINT          uiLow, uiHi ;
     HWND          hwndClient ;
     MSG           msg ;
     POPADVISE    *pPopAdvise ;
     WORD          cfFormat, wStatus ;

     switch (iMsg)
          {
          case WM_CREATE :

                    // Allocate memory for POPADVISE structures

               hPopAdvise = GlobalAlloc (GHND, NUM_STATES * sizeof (POPADVISE));

               if (hPopAdvise == NULL)
                    DestroyWindow (hwnd) ;
               else
                    SetWindowLong (hwnd, 4, (LONG) hPopAdvise) ;

               return 0 ;

          case WM_DDE_REQUEST :

                    // wParam          -- sending window handle
                    // LOWORD (lParam) -- data format
                    // HIWORD (lParam) -- item atom

               hwndClient = (HWND) wParam ;
               cfFormat   = LOWORD (lParam) ;
               aItem      = HIWORD (lParam) ;

                    // Check for matching format and data item

               if (cfFormat == CF_TEXT)
                    {
                    GlobalGetAtomName (aItem, szItem, sizeof (szItem)) ;

                    for (i = 0 ; i < NUM_STATES ; i++)
                         if (strcmp (szItem, pop[i].szState) == 0)
                              break ;

                    if (i < NUM_STATES)
                         {
                         GlobalDeleteAtom (aItem) ;
                         PostDataMessage (hwnd, hwndClient, i,
                                          FALSE, FALSE, TRUE) ;
                         return 0 ;
                         }
                    }

                    // Negative acknowledge if no match

               DdeAck.bAppReturnCode = 0 ;
               DdeAck.reserved       = 0 ;
               DdeAck.fBusy          = FALSE ;
               DdeAck.fAck           = FALSE ;

               wStatus = *((WORD *) &DdeAck) ;

               if (!PostMessage (hwndClient, WM_DDE_ACK, (WPARAM) hwnd,
                                 PackDDElParam (WM_DDE_ACK, wStatus, aItem)))
                    {
                    GlobalDeleteAtom (aItem) ;
                    }

               return 0 ;

          case WM_DDE_ADVISE :

                    // wParam -- sending window handle
                    // lParam -- DDEADVISE memory handle & item atom

               UnpackDDElParam (WM_DDE_ADVISE, lParam, &uiLow, &uiHi) ;
               FreeDDElParam (WM_DDE_ADVISE, lParam) ;

               hwndClient = (HWND) wParam ;
               hDdeAdvise = (GLOBALHANDLE) uiLow ;
               aItem      = (ATOM) uiHi ;

               pDdeAdvise = (DDEADVISE *) GlobalLock (hDdeAdvise) ;

                    // Check for matching format and data item

               if (pDdeAdvise->cfFormat == CF_TEXT)
                    {
                    GlobalGetAtomName (aItem, szItem, sizeof (szItem)) ;

                    for (i = 0 ; i < NUM_STATES ; i++)
                         if (strcmp (szItem, pop[i].szState) == 0)
                              break ;

                         // Fill in the POPADVISE structure and acknowledge

                    if (i < NUM_STATES)
                         {
                         hPopAdvise = (GLOBALHANDLE) GetWindowLong (hwnd, 4) ;
                         pPopAdvise = (POPADVISE *)
                                              GlobalLock (hPopAdvise) ;

                         pPopAdvise[i].fAdvise   = TRUE ;
                         pPopAdvise[i].fDeferUpd = pDdeAdvise->fDeferUpd ;
                         pPopAdvise[i].fAckReq   = pDdeAdvise->fAckReq ;
                         pPopAdvise[i].lPopPrev  = pop[i].lPop ;

                         GlobalUnlock (hDdeAdvise) ;
                         GlobalFree (hDdeAdvise) ;

                         DdeAck.bAppReturnCode = 0 ;
                         DdeAck.reserved       = 0 ;
                         DdeAck.fBusy          = FALSE ;
                         DdeAck.fAck           = TRUE ;

                         wStatus = *((WORD *) &DdeAck) ;

                         if (!PostMessage (hwndClient, WM_DDE_ACK,
                                           (WPARAM) hwnd,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -