📄 showpop2.c
字号:
/*------------------------------------------
SHOWPOP2.C -- DDEML Client using DDEPOP2
(c) Charles Petzold, 1996
------------------------------------------*/
#include <windows.h>
#include <ddeml.h>
#include <stdlib.h>
#include <string.h>
#include "showpop.h"
#define WM_USER_INITIATE (WM_USER + 1)
#define DDE_TIMEOUT 3000
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
HDDEDATA CALLBACK DdeCallback (UINT, UINT, HCONV, HSZ, HSZ,
HDDEDATA, DWORD, DWORD) ;
char szAppName[] = "ShowPop2" ;
DWORD idInst ;
HCONV hConv ;
HWND hwnd ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
MSG msg ;
WNDCLASSEX wndclass ;
wndclass.cbSize = sizeof (wndclass) ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
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) ;
hwnd = CreateWindow (szAppName, "DDEML Client - US Population",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
// Initialize for using DDEML
if (DdeInitialize (&idInst, (PFNCALLBACK) &DdeCallback,
APPCLASS_STANDARD | APPCMD_CLIENTONLY, 0L))
{
MessageBox (hwnd, "Could not initialize client!",
szAppName, MB_ICONEXCLAMATION | MB_OK) ;
DestroyWindow (hwnd) ;
return FALSE ;
}
// Start things going
SendMessage (hwnd, WM_USER_INITIATE, 0, 0L) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
// Uninitialize DDEML
DdeUninitialize (idInst) ;
return msg.wParam ;
}
HDDEDATA CALLBACK DdeCallback (UINT iType, UINT iFmt, HCONV hConv,
HSZ hsz1, HSZ hsz2, HDDEDATA hData,
DWORD dwData1, DWORD dwData2)
{
char szItem[10], szPopulation[16] ;
int i ;
switch (iType)
{
case XTYP_ADVDATA : // hsz1 = topic
// hsz2 = item
// hData = data
// Check for matching format and data item
if (iFmt != CF_TEXT)
return DDE_FNOTPROCESSED ;
DdeQueryString (idInst, hsz2, szItem, sizeof (szItem), 0) ;
for (i = 0 ; i < NUM_STATES ; i++)
if (strcmp (szItem, pop[i].szAbb) == 0)
break ;
if (i >= NUM_STATES)
return DDE_FNOTPROCESSED ;
// Store the data and invalidate the window
DdeGetData (hData, (unsigned char *) szPopulation,
sizeof (szPopulation), 0) ;
pop[i].lPop = atol (szPopulation) ;
InvalidateRect (hwnd, NULL, FALSE) ;
return (HDDEDATA) DDE_FACK ;
case XTYP_DISCONNECT :
hConv = NULL ;
MessageBox (hwnd, "The server has disconnected.",
szAppName, MB_ICONASTERISK | MB_OK) ;
return NULL ;
}
return NULL ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
static char szService[] = "DdePop2",
szTopic[] = "US_Population" ;
static long cxChar, cyChar ;
char szBuffer[24] ;
HDC hdc ;
HSZ hszService, hszTopic, hszItem ;
PAINTSTRUCT ps ;
int i ;
long x, y ;
TEXTMETRIC tm ;
switch (iMsg)
{
case WM_CREATE :
hdc = GetDC (hwnd) ;
GetTextMetrics (hdc, &tm) ;
cxChar = tm.tmAveCharWidth ;
cyChar = tm.tmHeight + tm.tmExternalLeading ;
ReleaseDC (hwnd, hdc) ;
return 0 ;
case WM_USER_INITIATE :
// Try connecting
hszService = DdeCreateStringHandle (idInst, szService, 0) ;
hszTopic = DdeCreateStringHandle (idInst, szTopic, 0) ;
hConv = DdeConnect (idInst, hszService, hszTopic, NULL) ;
// If that doesn't work, load server
if (hConv == NULL)
{
WinExec (szService, SW_SHOWMINNOACTIVE) ;
hConv = DdeConnect (idInst, hszService, hszTopic, NULL) ;
}
// Free the string handles
DdeFreeStringHandle (idInst, hszService) ;
DdeFreeStringHandle (idInst, hszTopic) ;
// If still not connected, display message box
if (hConv == NULL)
{
MessageBox (hwnd, "Cannot connect with DDEPOP2.EXE!",
szAppName, MB_ICONEXCLAMATION | MB_OK) ;
return 0 ;
}
// Request notification
for (i = 0 ; i < NUM_STATES ; i++)
{
hszItem = DdeCreateStringHandle (idInst, pop[i].szAbb, 0) ;
DdeClientTransaction (NULL, 0, hConv, hszItem, CF_TEXT,
XTYP_ADVSTART | XTYPF_ACKREQ,
DDE_TIMEOUT, NULL) ;
DdeFreeStringHandle (idInst, hszItem) ;
}
if (i < NUM_STATES)
{
MessageBox (hwnd, "Failure on WM_DDE_ADVISE!",
szAppName, MB_ICONEXCLAMATION | MB_OK) ;
}
return 0 ;
case WM_PAINT :
hdc = BeginPaint (hwnd, &ps) ;
for (i = 0 ; i < NUM_STATES ; i++)
{
if (i < (NUM_STATES + 1) / 2)
{
x = cxChar ;
y = i * cyChar ;
}
else
{
x = 44 * cxChar ;
y = (i - (NUM_STATES + 1) / 2) * cyChar ;
}
TextOut (hdc, x, y, szBuffer,
wsprintf (szBuffer, "%-20s",
(PSTR) pop[i].szState)) ;
x += 36 * cxChar ;
SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;
TextOut (hdc, x, y, szBuffer,
wsprintf (szBuffer, "%10ld", pop[i].lPop)) ;
SetTextAlign (hdc, TA_LEFT | TA_TOP) ;
}
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_CLOSE :
if (hConv == NULL)
break ;
// Stop the advises
for (i = 0 ; i < NUM_STATES ; i++)
{
hszItem = DdeCreateStringHandle (idInst, pop[i].szAbb, 0) ;
DdeClientTransaction (NULL, 0, hConv, hszItem, CF_TEXT,
XTYP_ADVSTOP, DDE_TIMEOUT, NULL) ;
DdeFreeStringHandle (idInst, hszItem) ;
}
// Disconnect the conversation
DdeDisconnect (hConv) ;
break ; // for default processing
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -