MAIN.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:52k
源码类别:

Windows编程

开发平台:

Visual C++

  1. //-----------------------------------------------------------------------------
  2. // Microsoft OLE DB QURYDEMO Sample
  3. // Copyright (C) 1995-1998 Microsoft Corporation
  4. //
  5. // @doc
  6. //
  7. // @module MAIN.CPP
  8. //
  9. //-----------------------------------------------------------------------------------
  10. /*
  11. PROGRAM: QURYDEMO
  12. ========
  13. PURPOSE:
  14. ========
  15. demonstrates a simple MDI application that allows a user to
  16. simultaneously connect to multiple hetrogeneous databases
  17. and perform SQL queries to get results.
  18. FUNCTIONS:
  19. ==========
  20. WinMain() - main routine
  21. MainWndProc() - processes Main Application Window messages
  22. MDIChildProc() - processes MDI child window messages
  23. ToolbarProc() - processes tool bar messages
  24. StatusbarProc() - processes Status bar messages
  25. ConnectDlgProc() - processes Connection Dialog box messages
  26. DisconnectDlgProc() - processes Disconnect Dialog box messages
  27. AboutDlgProc() - processes messages for About dialog box
  28. MDIChildDlgProc() - process messages for dummy child dialog box in MDI window
  29. DrawBitmap() - draws bitmaps for toolbuttons
  30. COMMENTS:
  31. =========
  32. Created by Microsoft Corporation.
  33. */
  34. #define STRICT
  35. #include <stdio.h>
  36. #include <string.h>
  37. #include <time.h>
  38. #include <windows.h>
  39. #include <windowsx.h>
  40. #ifdef CTL3D
  41. #include "ctl3d.h"
  42. #endif
  43. #include "oledb.h"
  44. #include "oledberr.h"
  45. #include "qurydemo.h"  
  46. // Globals
  47. HWND hWndFrame;       // Main Frame Window handle
  48. HWND hWndCrsrList;    // hdbc(s) combobox on the tool bar
  49. HWND hWndStmtList;    // hstmt(s) combobox on the tool bar
  50. HWND hWndMDIClient;   // MDI Client window handle
  51. HWND hWndActiveChild; // Current active MDI Child window
  52. HINSTANCE hAppInstance;    // Application instance
  53. int iTimex;          // Time box (on the status bar) width
  54. int iDatex;          // Date box (on the status bar) width
  55. HWND hWndToolbar;     // Toolbar window handle
  56. HWND hWndStatusbar;   // status bar handle
  57. WORD wStatusText;     // Status text state
  58. RECT rectStatusText;  // Text box on the status bar
  59. // Locals.
  60. void FillPrompt(HWND hWnd);
  61. /*
  62. FUNCTION: WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  63. COMMENTS: Application Entry Routine.
  64.   Register Classes. Create Main Window and MDI Child Window.
  65.   Process Main Message Loop.
  66. */
  67. int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  68. {
  69. MSG msg; //msg structure
  70. WNDCLASS wc; //class structure
  71.     HICON hMainIcon; //App Icon
  72.     HICON hMDIChildIcon; //MDI Child Icon
  73. HWND hWndMDIChild; //temp MDI Child Window Handle
  74. char szBuffer[MAXBUFLEN+1]; //temp string buffer to check class name
  75. BOOL bDialogMessage = FALSE; //temp boolean to check dilogbox msgs
  76. HACCEL hAccel; //accelerator table handle
  77. hAppInstance = hInstance;
  78. // Check if application is already running, if
  79. // so make it active and bring it in focus
  80. if (hWndFrame = FindWindow(OLEDBFRAMECLASS, NULL))
  81. {
  82. hWndFrame = GetLastActivePopup(hWndFrame);
  83. if (IsIconic(hWndFrame))
  84. OpenIcon(hWndFrame);
  85. else
  86. BringWindowToTop(hWndFrame);
  87. ACTIVATEWINDOW(hWndFrame);
  88. return (FALSE);
  89. }
  90. // Initialize OLEDB Interface
  91. if (!InitEnvironment())
  92. {
  93. MessageBox(hWndFrame, INITERROR, EXECERROR, MB_OK|MB_ICONHAND);
  94. return (FALSE);
  95. }
  96. // Register window classes for the application - Main Window Class
  97. wc.style = 0;
  98. wc.lpfnWndProc = MainWndProc;
  99. wc.cbClsExtra = 0;
  100. wc.cbWndExtra = 0;
  101. wc.hInstance = hAppInstance;
  102. wc.hIcon = hMainIcon = LoadIcon(hAppInstance, APPICON);
  103. wc.hCursor = LoadCursor((HINSTANCE)NULL, IDC_ARROW);
  104. wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE+1);
  105. wc.lpszMenuName = QURYDEMOMENU;
  106. wc.lpszClassName = OLEDBFRAMECLASS;
  107. if (!RegisterClass(&wc))
  108. {
  109. MessageBox(hWndFrame, CLASSERROR, EXECERROR, MB_OK|MB_ICONHAND|MB_TASKMODAL);
  110. return (FALSE);
  111. }
  112.         
  113. // register Toolbar Class
  114. wc.hIcon = (HICON)NULL;
  115. wc.lpszMenuName =  NULL;
  116. wc.lpfnWndProc = ToolbarProc;
  117. wc.lpszClassName = OLEDBTOOLCLASS;
  118. if (!RegisterClass(&wc))
  119. {
  120. MessageBox(hWndFrame, CLASSERROR, EXECERROR, MB_OK|MB_ICONHAND|MB_TASKMODAL);
  121. return (FALSE);
  122. }
  123.         
  124. // register Statusbar Class
  125. wc.lpfnWndProc = StatusbarProc;
  126. wc.lpszClassName = OLEDBSTATUSCLASS;
  127. if (!RegisterClass(&wc))
  128. {
  129. MessageBox(hWndFrame, CLASSERROR, EXECERROR, MB_OK|MB_ICONHAND|MB_TASKMODAL);
  130. return (FALSE);
  131. }
  132. // register MDI Child Window Class
  133. wc.hIcon  = hMDIChildIcon = LoadIcon(hAppInstance, QUERYWINDOWICON);
  134. wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  135. wc.cbWndExtra = CBWNDEXTRA;
  136. wc.lpszClassName = OLEDBMDICLASS;
  137. wc.lpfnWndProc = MDIChildProc;
  138. if (!RegisterClass(&wc))
  139. {
  140. MessageBox(hWndFrame, CLASSERROR, EXECERROR, MB_OK|MB_ICONHAND|MB_TASKMODAL);
  141. return (FALSE);
  142. }
  143. // create Main window and the MDI Client window
  144. if (!(hWndFrame = CreateWindow(OLEDBFRAMECLASS, APPTITLE, WS_OVERLAPPEDWINDOW, 
  145. CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  146. (HWND)NULL, (HMENU)NULL, hAppInstance, NULL)))
  147. {
  148. MessageBox(hWndFrame, CREATEMAINERR, EXECERROR, MB_OK|MB_ICONHAND|MB_TASKMODAL); 
  149. return (FALSE);
  150. }
  151. ShowWindow(hWndFrame, nCmdShow);
  152. UpdateWindow(hWndFrame);
  153. #ifdef CTL3D
  154. // register 3D controls
  155. Ctl3dRegister(hAppInstance);
  156. Ctl3dAutoSubclass(hAppInstance);
  157. #endif
  158. // load accelerators
  159. hAccel = LoadAccelerators(hAppInstance, APPACCELERATOR);
  160. // acquire and dispatch messages until a WM_QUIT message is received
  161. while (GetMessage(&msg, (HWND)NULL, 0, 0))
  162. {           
  163. // check for App accelerators
  164. if (TranslateAccelerator(hWndFrame, hAccel, &msg))
  165. continue;
  166. // check for MDI accelerators
  167. if (TranslateMDISysAccel(hWndMDIClient, &msg))
  168. continue;
  169.                                             
  170.         // each MDI Child has a modeless dialog in its client area
  171.         // to provide tab controls. Check for Modeless Dialog msgs.
  172. for (hWndMDIChild = GetWindow(hWndMDIClient, GW_CHILD); hWndMDIChild; hWndMDIChild = GetWindow(hWndMDIChild, GW_HWNDNEXT))
  173. {
  174. GetClassName(hWndMDIChild, szBuffer, MAXBUFLEN);
  175. if (strcmp(szBuffer, OLEDBMDICLASS))
  176. continue;
  177. if (IsDialogMessage((HWND)GetWindowLong(hWndMDIChild, GWLAPP_HDLG), &msg))
  178. {
  179. bDialogMessage = TRUE;
  180. break;
  181. }
  182. }
  183. if (bDialogMessage)
  184. {
  185. bDialogMessage = FALSE;
  186. continue;
  187.         }
  188.                 
  189.         // if the message does not need special processing, dispatch it
  190. TranslateMessage(&msg);
  191. DispatchMessage(&msg);
  192. }
  193. #ifdef CTL3D
  194. // unregister 3D controls
  195. Ctl3dUnregister(hAppInstance);
  196. #endif
  197. // Free memory used by OLEDB interface
  198. FreeEnvironment();
  199. // free Icon resources
  200. if (hMainIcon)
  201. DestroyIcon(hMainIcon);
  202. if (hMDIChildIcon)
  203. DestroyIcon(hMDIChildIcon);
  204. return (msg.wParam);
  205. }
  206. /*
  207. FUNCTION: MainWndProc(HWND hWnd, UINT  message, WPARAM wParam, LPARAM lParam)
  208. COMMENTS: Windows Callback procedure to handle Window messages.
  209.           Menu Commands and System Command messages are handled by
  210.           this main window.
  211. */
  212. long CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  213. {
  214. switch (message)
  215. {
  216. static int iToolY;         //remember Toolbar height for resize
  217. static int iStatusY;       //remember Statusbar height for resize
  218. case WM_CREATE:
  219.         {
  220. CLIENTCREATESTRUCT ccs; //MDIclient window structure
  221. HDC hDC; //Device Context handle
  222. SIZE sizeBar; //Size of a text bar
  223. RECT rectCombo;  //Size of combo box
  224. // Create child windows
  225.                 //1. combobox to display connections - DSN, SESSION
  226.                 //2. combobox to display HSTMT on current SESSION
  227.                 //3. Toolbar to put toolbuttons
  228.                 //4. Statusbat to display current action, date and time
  229.                 //5. MDI Client Window to process MDI children
  230.                 
  231. hWndCrsrList = CreateWindow(COMBOBOXCLASS, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
  232. WS_VSCROLL | CBS_DROPDOWNLIST | CBS_DISABLENOSCROLL, 5, 2, 180, 150, hWnd,
  233. (HMENU)IDW_CRSRLIST, hAppInstance, NULL);
  234. hWndStmtList = CreateWindow(COMBOBOXCLASS, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
  235. WS_VSCROLL | CBS_DROPDOWNLIST | CBS_DISABLENOSCROLL, 190, 2, 150, 150, hWnd,
  236. (HMENU)IDW_COMMANDLIST, hAppInstance, NULL);
  237. hWndToolbar = CreateWindow(OLEDBTOOLCLASS, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS,
  238. 0, 0, 0, 0, hWnd, (HMENU)IDW_TOOLBAR, hAppInstance, NULL);
  239. hWndStatusbar = CreateWindow(OLEDBSTATUSCLASS, NULL, WS_CHILD | WS_VISIBLE |
  240. WS_CLIPSIBLINGS, 0, 0, 0, 0, hWnd, (HMENU)IDW_STATUSBAR, hAppInstance, NULL);
  241. ccs.hWindowMenu = GetSubMenu(GetMenu(hWnd), WINDOWMENUPLACE);
  242. ccs.idFirstChild = IDM_MDICHILD;
  243. hWndMDIClient = CreateWindow(MDICLIENTCLASS, NULL, WS_CHILD | WS_CLIPSIBLINGS |
  244. WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL | WS_VISIBLE, 0, 0, 0, 0, hWnd,
  245. (HMENU)IDW_MDICLIENT, hAppInstance, (LPSTR)&ccs);
  246. // check to see if any of the above window creation failed
  247. if (!hWndCrsrList || !hWndStmtList || !hWndToolbar || !hWndStatusbar || !hWndMDIClient)
  248. {
  249. MessageBox(hWnd, CREATEMAINERR, EXECERROR, MB_OK|MB_ICONHAND|MB_TASKMODAL); 
  250. PostMessage(hWnd, WM_CLOSE, 0, 0);
  251. break;
  252. }
  253. // calculate proper text height for tool and status bars
  254. GetWindowRect(hWndStmtList, &rectCombo);
  255. iToolY = rectCombo.bottom - rectCombo.top + TOOLBARMARGINY;
  256. if (hDC = GetDC(hWndStatusbar))
  257. {
  258. GetTextExtentPoint(hDC, ALPHABETS, strlen(ALPHABETS), &sizeBar);
  259. ReleaseDC(hWndStatusbar, hDC);
  260. iStatusY = sizeBar.cy + STATUSBARMARGINY;
  261. }
  262. else
  263. {
  264. iStatusY = 0;
  265. DestroyWindow(hWndStatusbar);
  266. }
  267. break;
  268. }
  269. // Limit minimum size of the main window
  270. case WM_GETMINMAXINFO:
  271. ((MINMAXINFO FAR*)lParam)->ptMinTrackSize.x = 
  272. max(MINWIDTH, rectStatusText.right-rectStatusText.left+iTimex+iDatex+14);
  273. ((MINMAXINFO FAR*)lParam)->ptMinTrackSize.y = MINHEIGHT;
  274. break;
  275. // Resize children
  276. case WM_SIZE:
  277.         {
  278. WORD wWidth = LOWORD(lParam); //width of rectangle
  279. WORD wHeight = HIWORD(lParam); //height of rectangle
  280. MoveWindow(hWndToolbar, 0, 0, wWidth, iToolY, TRUE);
  281. MoveWindow(hWndStatusbar, 0, wHeight-iStatusY, wWidth, iStatusY, TRUE);
  282. InvalidateRect(hWndStatusbar, NULL, TRUE);
  283. MoveWindow(hWndMDIClient, 0, iToolY, wWidth, wHeight-iStatusY-iToolY, TRUE);
  284. break;
  285.         }
  286. #ifdef CTL3D
  287. // Inform 3D controls of color change                
  288. case WM_SYSCOLORCHANGE:
  289. Ctl3dColorChange();
  290. break;
  291. #endif
  292. // Close comboboxes if dropped down
  293. case WM_SYSCOMMAND:
  294. SendMessage(hWndCrsrList, CB_SHOWDROPDOWN, (WPARAM)FALSE, 0);
  295. SendMessage(hWndStmtList, CB_SHOWDROPDOWN, (WPARAM)FALSE, 0);
  296. return (DefFrameProc(hWnd, hWndMDIClient, message, wParam, lParam));
  297. // Initialize popup menus
  298. case WM_INITMENUPOPUP:
  299.         {
  300.         int iMenuId; //Menu ID being processed
  301. int nItems;         //# of menu items
  302. int nPos;           //Menu Position
  303.         // Ignore the msg if it is for a system menu
  304. if (HIWORD(lParam))
  305. break;
  306. // Go through the menu items for current popup menu
  307. // and enable/disable menu item, if required
  308. nItems = GetMenuItemCount((HMENU)wParam);
  309. for (nPos = 0; nPos < nItems; nPos++)
  310. switch (iMenuId = GetMenuItemID((HMENU)wParam, nPos))
  311. {
  312. case IDM_DISCONNECT:
  313. case IDM_NEW:
  314. EnableMenuItem( (HMENU)wParam, iMenuId, MF_BYCOMMAND|
  315. ((SendMessage(hWndCrsrList, CB_GETCOUNT, 0, 0) > 0)?
  316. MF_ENABLED:MF_GRAYED) );
  317. break;
  318. case IDM_QUERY:
  319. case IDM_TILE:
  320. case IDM_CASCADE:
  321. case IDM_ICONS:
  322. case IDM_CLOSEALL:
  323. case IDM_ASSERTIONS:
  324. case IDM_CATALOGS:
  325. case IDM_CHARACTER_SETS:
  326. case IDM_CHECK_CONSTRAINTS:
  327. case IDM_COLLATIONS:
  328. case IDM_COLUMN_DOMAIN_USAGE:
  329. case IDM_COLUMN_PRIVILEGES:
  330. case IDM_COLUMNS:
  331. case IDM_CONSTRAINT_COLUMN_USAGE:
  332. case IDM_CONSTRAINT_TABLE_USAGE:
  333. case IDM_FOREIGN_KEYS:
  334. case IDM_INDEXES:
  335. case IDM_KEY_COLUMN_USAGE:
  336. case IDM_PRIMARY_KEYS:
  337. case IDM_PROCEDURE_COLUMNS:
  338. case IDM_PROCEDURE_PARAMETERS:
  339. case IDM_PROCEDURES:
  340. case IDM_PROVIDER_TYPES:
  341. case IDM_REFERENTIAL_CONSTRAINTS:
  342. case IDM_SCHEMATA:
  343. case IDM_SQL_LANGUAGES:
  344. case IDM_STATISTICS:
  345. case IDM_TABLE_CONSTRAINTS:
  346. case IDM_TABLE_PRIVILEGES:
  347. case IDM_TABLES:
  348. case IDM_TRANSLATIONS:
  349. case IDM_USAGE_PRIVILEGES:
  350. case IDM_VIEW_COLUMN_USAGE:
  351. case IDM_VIEW_TABLE_USAGE:
  352. case IDM_VIEWS:
  353. EnableMenuItem( (HMENU)wParam, iMenuId, MF_BYCOMMAND|
  354. (GetWindow(hWndMDIClient, GW_CHILD)?
  355. MF_ENABLED:MF_GRAYED) );
  356. break;
  357. default:
  358. break;
  359. }
  360. break;
  361. }
  362. // Update status bar to reflect menu selection
  363. case WM_MENUSELECT:
  364. {
  365.             int iMenuFlag;  //Check menu type
  366.             HMENU hMenu;            //Menu Handle
  367.             char szMenuName[MAXBUFLEN+1]; //Menu Name 
  368.             // store Menuitem ID as a state value for text display
  369. wStatusText = GET_WM_MENUSELECT_CMD(wParam, lParam);
  370. // process popup menus ie non menuitem selections
  371. iMenuFlag = GET_WM_MENUSELECT_FLAGS(wParam, lParam);
  372. // if the selected menu is a system popup menu
  373.         // else if the selected menu is a popup menu check menu names
  374.         // OR check if it is a control popup menu of maximized MDI Child window
  375.         if (wStatusText && (iMenuFlag & MF_SYSMENU) && (iMenuFlag & MF_POPUP))
  376. wStatusText = IDM_POPUPAPPSYS;
  377. else if (wStatusText && (iMenuFlag & MF_POPUP))
  378. {
  379. hMenu = (HMENU)wStatusText;
  380. GetMenuString(hMenu, 0, szMenuName, MAXBUFLEN, MF_BYPOSITION);
  381. if (!strcmp(szMenuName, MENUITEMCONNECT))
  382. wStatusText = IDM_POPUPLOGIN;
  383. else if (!strcmp(szMenuName, MENUITEMQUERY))
  384. wStatusText = IDM_POPUPQUERY;
  385. else if (!strcmp(szMenuName, MENUITEMTILE))
  386. wStatusText = IDM_POPUPSCHEMA;
  387. else if (!strcmp(szMenuName, MENUITEMTYPES))
  388. wStatusText = IDM_POPUPWINDOW;
  389. else if (!strcmp(szMenuName, MENUITEMAPPHELP))
  390. wStatusText = IDM_POPUPHELP;
  391. else if (GetMenuString(hMenu, SC_NEXTWINDOW, szMenuName, MAXBUFLEN, MF_BYCOMMAND)>0)
  392. wStatusText = IDM_POPUPMDISYS;
  393.             else
  394.                 wStatusText = 0;
  395.         }
  396. // invalidate status bar for repaint
  397. InvalidateRect(hWndStatusbar, &rectStatusText, TRUE);
  398. break;
  399. }
  400. // Process menu commands
  401. case WM_COMMAND:
  402. switch (GET_WM_COMMAND_ID(wParam, lParam))
  403. {
  404. case IDM_INITIALIZE: // bring up connect dialog & do connect processing
  405. DialogBox(hAppInstance, INITDIALOG, hWnd, ConnectDlgProc);
  406. break;
  407.                                                 
  408. case IDM_DISCONNECT: // bringup disconnect dlg and do disconnects
  409. DialogBox(hAppInstance, DISCONNECTDIALOG, hWnd, DisconnectDlgProc);
  410. break;
  411. case IDM_QUERY: // process execute query request
  412. ExecuteQuery();
  413. break;
  414. case IDM_ASSERTIONS: // Execute DBSCHEMA_ASSERTIONS request
  415. GetSchemaRowset(DBSCHEMA_ASSERTIONS);
  416. break;
  417. case IDM_CATALOGS: // Execute DBSCHEMA_CATALOGS request
  418. GetSchemaRowset(DBSCHEMA_CATALOGS);
  419. break;
  420. case IDM_CHARACTER_SETS: // Execute DBSCHEMA_CHARACTER_SETS request
  421. GetSchemaRowset(DBSCHEMA_CHARACTER_SETS);
  422. break;
  423. case IDM_CHECK_CONSTRAINTS: // Execute DBSCHEMA_CHECK_CONSTRAINTS request
  424. GetSchemaRowset(DBSCHEMA_CHECK_CONSTRAINTS);
  425. break;
  426. case IDM_COLLATIONS: // Execute DBSCHEMA_COLLATIONS request
  427. GetSchemaRowset(DBSCHEMA_COLLATIONS);
  428. break;
  429. case IDM_COLUMN_DOMAIN_USAGE: // Execute DBSCHEMA_COLUMN_DOMAIN_USAGE request
  430. GetSchemaRowset(DBSCHEMA_COLUMN_DOMAIN_USAGE);
  431. break;
  432. case IDM_COLUMN_PRIVILEGES: // Execute DBSCHEMA_COLUMN_PRIVELEGES request
  433. GetSchemaRowset(DBSCHEMA_COLUMN_PRIVILEGES);
  434. break;
  435. case IDM_COLUMNS: // Execute DBSCHEMA_COLUMNS request
  436. GetSchemaRowset(DBSCHEMA_COLUMNS);
  437. break;
  438. case IDM_CONSTRAINT_COLUMN_USAGE: // Execute DBSCHEMA_CONSTRAINT_COLUMN_USAGE request
  439. GetSchemaRowset(DBSCHEMA_CONSTRAINT_COLUMN_USAGE);
  440. break;
  441. case IDM_CONSTRAINT_TABLE_USAGE: // Execute DBSCHEMA_CONSTRAINT_TABLE_USAGE request
  442. GetSchemaRowset(DBSCHEMA_CONSTRAINT_TABLE_USAGE);
  443. break;
  444. case IDM_FOREIGN_KEYS: // Execute DBSCHEMA_FOREIGN_KEYS request
  445. GetSchemaRowset(DBSCHEMA_FOREIGN_KEYS);
  446. break;
  447. case IDM_INDEXES: // Execute DBSCHEMA_INDEXES request
  448. GetSchemaRowset(DBSCHEMA_INDEXES);
  449. break;
  450. case IDM_KEY_COLUMN_USAGE: // Execute DBSCHEMA_KEY_COLUMN_USAGE request
  451. GetSchemaRowset(DBSCHEMA_KEY_COLUMN_USAGE);
  452. break;
  453. case IDM_PRIMARY_KEYS: // Execute DBSCHEMA_PRIMARY_KEYS request
  454. GetSchemaRowset(DBSCHEMA_PRIMARY_KEYS);
  455. break;
  456. case IDM_PROCEDURE_COLUMNS: // Execute DBSCHEMA_PROCEDURE_COLUMNS request
  457. GetSchemaRowset(DBSCHEMA_PROCEDURE_COLUMNS);
  458. break;
  459. case IDM_PROCEDURE_PARAMETERS: // Execute DBSCHEMA_PROCEDURE_PARAMETERS request
  460. GetSchemaRowset(DBSCHEMA_PROCEDURE_PARAMETERS);
  461. break;
  462. case IDM_PROCEDURES: // Execute DBSCHEMA_PROCEDURES request
  463. GetSchemaRowset(DBSCHEMA_PROCEDURES);
  464. break;
  465. case IDM_PROVIDER_TYPES: // Execute DBSCHEMA_TYPES request
  466. GetSchemaRowset(DBSCHEMA_PROVIDER_TYPES);
  467. break;
  468. case IDM_REFERENTIAL_CONSTRAINTS: // Execute DBSCHEMA_REFERENTIAL_CONSTRAINTS request
  469. GetSchemaRowset(DBSCHEMA_REFERENTIAL_CONSTRAINTS);
  470. break;
  471. case IDM_SCHEMATA: // Execute DBSCHEMA_SCHEMATA request
  472. GetSchemaRowset(DBSCHEMA_SCHEMATA);
  473. break;
  474. case IDM_SQL_LANGUAGES: // Execute DBSCHEMA_SQL_LANGUAGES request
  475. GetSchemaRowset(DBSCHEMA_SQL_LANGUAGES);
  476. break;
  477. case IDM_STATISTICS: // Execute DBSCHEMA_STATISTICS request
  478. GetSchemaRowset(DBSCHEMA_STATISTICS);
  479. break;
  480. case IDM_TABLE_CONSTRAINTS: // Execute DBSCHEMA_TABLE_CONSTRAINTS request
  481. GetSchemaRowset(DBSCHEMA_TABLE_CONSTRAINTS);
  482. break;
  483. case IDM_TABLE_PRIVILEGES: // Execute DBSCHEMA_TABLE_PRIVILEGES request
  484. GetSchemaRowset(DBSCHEMA_TABLE_PRIVILEGES);
  485. break;
  486. case IDM_TABLES: // Execute DBSCHEMA_TABLES request
  487. GetSchemaRowset(DBSCHEMA_TABLES);
  488. break;
  489. case IDM_TRANSLATIONS: // Execute DBSCHEMA_TRANSLATIONS request
  490. GetSchemaRowset(DBSCHEMA_TRANSLATIONS);
  491. break;
  492. case IDM_USAGE_PRIVILEGES: // Execute DBSCHEMA_USAGE_PRIVILEGES request
  493. GetSchemaRowset(DBSCHEMA_USAGE_PRIVILEGES);
  494. break;
  495. case IDM_VIEW_COLUMN_USAGE: // Execute DBSCHEMA_VIEW_COLUMN_USAGE request
  496. GetSchemaRowset(DBSCHEMA_VIEW_COLUMN_USAGE);
  497. break;
  498. case IDM_VIEW_TABLE_USAGE: // Execute DBSCHEMA_VIEW_TABLE_USAGE request
  499. GetSchemaRowset(DBSCHEMA_VIEW_TABLE_USAGE);
  500. break;
  501. case IDM_VIEWS: // Execute DBSCHEMA_VIEWS request
  502. GetSchemaRowset(DBSCHEMA_VIEWS);
  503. break;
  504. case IDM_EXIT: // process exit request
  505. SendMessage(hWndFrame, WM_CLOSE, 0, 0);
  506. break;
  507. case IDM_NEW: // create a new query window on current connect
  508. NewICommandWindow();
  509. break;
  510. case IDM_TILE: // let MDI Client tile the MDI children
  511. SendMessage(hWndMDIClient, WM_MDITILE, 0, 0);
  512. break;
  513. case IDM_CASCADE: // let MDI Client cascade MDI children
  514. SendMessage(hWndMDIClient, WM_MDICASCADE, 0, 0);
  515. break;
  516. case IDM_ICONS: // let MDI Client arrange iconic MDI children
  517. SendMessage(hWndMDIClient, WM_MDIICONARRANGE, 0, 0);
  518. break;
  519. case IDM_CLOSEALL: // Close all open windows and free hstmts
  520.             {
  521. HWND hWndTemp; //temp window handle
  522. // hide MDI Client Windows to avoid repaints
  523. ShowWindow(hWndMDIClient,SW_HIDE);
  524. while (hWndTemp = GetWindow(hWndMDIClient, GW_CHILD))
  525. SendMessage(hWndMDIClient, WM_MDIDESTROY, (WPARAM)hWndTemp, 0);
  526. ShowWindow(hWndMDIClient, SW_SHOW);
  527. break;
  528. }
  529. case IDM_ABOUT: // bringup About dialog
  530. DialogBox(hAppInstance, ABOUTDIALOG, hWnd, AboutDlgProc);
  531. break;
  532. case IDW_CRSRLIST: // change current cursor ?
  533. if (GET_WM_COMMAND_CMD(wParam, lParam) == CBN_SELCHANGE)
  534. ChangeCurrentCursor(GET_WM_COMMAND_HWND(wParam, lParam));
  535. else if (GET_WM_COMMAND_CMD(wParam, lParam) == CBN_KILLFOCUS)
  536. PostMessage(GET_WM_COMMAND_HWND(wParam, lParam), CB_SHOWDROPDOWN,
  537. (WPARAM)FALSE, 0);
  538. else
  539. DefFrameProc(hWnd, hWndMDIClient, WM_COMMAND, wParam, lParam);
  540. break;
  541. case IDW_COMMANDLIST: // change current Command ?
  542. if (GET_WM_COMMAND_CMD(wParam, lParam) == CBN_SELCHANGE)
  543. ChangeCurrentICommand(GET_WM_COMMAND_HWND(wParam, lParam));
  544. else if (GET_WM_COMMAND_CMD(wParam, lParam) == CBN_KILLFOCUS)
  545. PostMessage(GET_WM_COMMAND_HWND(wParam, lParam), CB_SHOWDROPDOWN,
  546. (WPARAM)FALSE, 0);
  547. else
  548. DefFrameProc(hWnd, hWndMDIClient, WM_COMMAND, wParam, lParam);
  549. break;
  550. default:
  551. DefFrameProc(hWnd, hWndMDIClient, WM_COMMAND, wParam, lParam);
  552. break;
  553. }
  554. break;
  555. case WM_CLOSE: //close all MDI windows, hdbcs & hstmts, else fail
  556. return (CloseIDBCreateCommand() ? DefFrameProc(hWnd, hWndMDIClient, message, wParam, lParam) : FALSE);
  557. case WM_DESTROY:
  558. PostQuitMessage(0);
  559. break;
  560. default:
  561. return (DefFrameProc(hWnd, hWndMDIClient, message, wParam, lParam));
  562. }
  563. return (0);
  564. }
  565. /*
  566. FUNCTION: MDIChildProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  567. COMMENTS: Window Procedure for MDI Child windows
  568. */
  569. long CALLBACK MDIChildProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  570. {
  571. switch (message)
  572. {
  573. HWND hWndTemp; //temporary window handle
  574. case WM_CREATE:
  575. // create child windows
  576. // 1. Modeless Dialog box in the background to process tabs
  577. // 2. Static Text to display prompt
  578. // 3. Edit Control to type SQL text
  579. // 4. List Box to display results
  580. // store dialog handle for future reference
  581. // set focus to edit control
  582. // if create failed due to low system resources
  583. if (!hWnd)
  584. break;
  585. hWndActiveChild = hWnd;
  586. hWndTemp = CreateDialog(hAppInstance, MDICHILDDIALOG, hWndActiveChild, MDIChildDlgProc);
  587. // check to see if the dialog was created?, if not destroy this window
  588. if (!hWndTemp)
  589. {
  590. return (-1);
  591. }
  592. SetWindowLong(hWnd, GWLAPP_HDLG, (LONG)hWndTemp);
  593. SetFocus(GetDlgItem(hWndTemp, IDTEXT_SQL));
  594. break;
  595. case WM_SIZE:
  596.                 {
  597. WORD wWidth; //New Width of MDI Child
  598. WORD wHeight; //New Height of MDI Child
  599. HDC hDC; //Device Context
  600. char szBuffer[MAXBUFLEN+1]; //Static Control Text
  601. int nStrLen; //Buffer Length
  602. SIZE size; //Screen size for text display
  603.                 
  604. // call default procedure first, to let MDI position the child & then move its children
  605. DefMDIChildProc(hWnd, message, wParam, lParam);
  606.         
  607.     // move child windows with proper screen size for text display
  608. wWidth = LOWORD(lParam);
  609. wHeight = HIWORD(lParam);
  610. hWndTemp = (HWND)GetWindowLong(hWnd, GWLAPP_HDLG);
  611. nStrLen = GetWindowText(GetDlgItem(hWndTemp, IDTEXT_PRMPT), szBuffer, MAXBUFLEN);
  612. hDC = GetDC(hWnd);
  613. GetTextExtentPoint(hDC, szBuffer, nStrLen, &size);
  614. ReleaseDC(hWnd, hDC);
  615.                 
  616.         MoveWindow(hWndTemp, 0, 0, wWidth, wHeight, TRUE);
  617. MoveWindow(GetDlgItem(hWndTemp, IDTEXT_PRMPT), 0, 0, size.cx+2, size.cy+2, TRUE);
  618. MoveWindow(GetDlgItem(hWndTemp, IDTEXT_SQL), size.cx+3, 0, wWidth - (size.cx+2), size.cy+2, TRUE);
  619. MoveWindow(GetDlgItem(hWndTemp, IDLIST_RSLT), 0, size.cy+3, wWidth, wHeight - (size.cy+2), TRUE);
  620. break;
  621.                 }
  622.                 
  623. case WM_MENUSELECT: // update status bar to reflect menu selection
  624.                 {
  625.                 int iMenuFlag; //Check menu type
  626.                 
  627. // store the Menu Item Id as a state value for text display
  628. wStatusText = GET_WM_MENUSELECT_CMD(wParam, lParam);
  629. // if none of the menuitems was selected, check if
  630. // the control popup menu is selected.
  631. iMenuFlag = GET_WM_MENUSELECT_FLAGS(wParam, lParam);
  632. // if the selected menu is a system popup menu
  633. if (wStatusText && (iMenuFlag & MF_SYSMENU) && (iMenuFlag & MF_POPUP))
  634. wStatusText = IDM_POPUPMDISYS;
  635. // invalidate status bar for repaint
  636. InvalidateRect(hWndStatusbar, &rectStatusText, TRUE);
  637. break;
  638. }
  639. case WM_MDIACTIVATE:
  640. // check if the display of comboboxes require a change
  641. if (GET_WM_MDIACTIVATE_FACTIVATE(hWnd, wParam, lParam) &&
  642. (hWndActiveChild) && (hWndActiveChild != hWnd))
  643. {
  644. hWndActiveChild = hWnd;
  645. DisplayNewCrsrAndICommand();
  646. }
  647. break;
  648. case WM_MOUSEACTIVATE:
  649.         // current window has changed, update comboboxes.
  650. hWndActiveChild = hWnd;
  651. DisplayNewCrsrAndICommand();
  652. break;
  653. case WM_SETFOCUS:
  654. // pass on the focus to the edit box for user to type in SQL
  655. SetFocus(GetDlgItem((HWND)GetWindowLong(hWnd, GWLAPP_HDLG), IDTEXT_SQL));
  656. break;
  657. case WM_DESTROY:
  658.         // check if the window was being destroyed while creation failed
  659.         if (!hWnd)
  660. break;
  661.                 
  662. // close the window and free instance thunk for modeless dialog
  663. CloseICommandWindow(hWnd);
  664. DestroyWindow((HWND)GetWindowLong(hWnd, GWLAPP_HDLG));
  665. if (hWnd == hWndActiveChild)
  666. hWndActiveChild = (HWND)NULL;
  667. break;
  668. default:
  669. return (DefMDIChildProc(hWnd, message, wParam, lParam));
  670. }
  671. return (0);
  672. }
  673. /*
  674. FUNCTION: ToolbarProc(HWND hWnd, UINT   message, WPARAM wParam, LPARAM lParam)
  675. COMMENTS: callback window procedure for toolbar window.
  676.   Handle pain and mouse messages to paint the toolbar and
  677.   provide default button behaviour for toolbar buttons.
  678. */
  679. long CALLBACK ToolbarProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  680. {
  681. switch (message)
  682. {
  683. static HBITMAP hbmpNewQuery; //btn1 bitmap handle
  684. static HBITMAP hbmpRunQuery; //btn2 bitmap handle
  685. static RECT stNewQuery; //btn1 rectangle
  686. static RECT stRunQuery;                 //btn2 rectangle
  687. POINT stMousePosition; //current mouse pos
  688. BOOL bButtonPosition; //mouse pos flag
  689. static BOOL bNewQueryBtnDown; //was btn1 down before?
  690. static BOOL bRunQueryBtnDown; //was btn2 down before?
  691. static int nLastButtonDown; //Which btn was down before?
  692. bNewQueryBtnDown = FALSE;
  693. bRunQueryBtnDown = FALSE;
  694. nLastButtonDown  = 0;
  695. case WM_CREATE:
  696. // load bitmaps for buttons
  697. // initialize static rectangles for button positions on toolbar
  698. // initialize state variable for status text display
  699. hbmpNewQuery = LoadBitmap(hAppInstance, BMP_NEWQUERY);
  700. hbmpRunQuery = LoadBitmap(hAppInstance, BMP_RUNQUERY);
  701. stNewQuery.left   = BTTNX;
  702. stNewQuery.right  = BTTNX+BTTNWIDTH+1;
  703. stNewQuery.top    = BTTNY;
  704. stNewQuery.bottom = BTTNY+BTTNHEIGHT+1;
  705.         stRunQuery.left   = BTTNX+BTTNWIDTH+BTTNMARGIN;
  706.         stRunQuery.right  = BTTNX+BTTNWIDTH+BTTNMARGIN+BTTNWIDTH+1;
  707.         stRunQuery.top    = BTTNY;
  708.         stRunQuery.bottom = BTTNY+BTTNHEIGHT+1;
  709.                 
  710. wStatusText = 0;
  711. break;
  712. case WM_DESTROY:
  713. // delete bitmap handles
  714. if (hbmpNewQuery)
  715. DeleteObject(hbmpNewQuery);
  716. if (hbmpRunQuery)
  717. DeleteObject(hbmpRunQuery);
  718. break;
  719. case WM_LBUTTONDOWN:
  720. // Check if the mouse key lies on any one of the buttons
  721. // if so, set state variable to reflect that button and
  722. // invalidate proper regions on tool & status bars for update.
  723. // set capture on mouse movements till the mouse key is
  724. // released.
  725. stMousePosition.x = LOWORD(lParam);
  726. stMousePosition.y = HIWORD(lParam);
  727. if (PtInRect(&stNewQuery, stMousePosition))
  728. {
  729. bNewQueryBtnDown = TRUE;
  730. wStatusText = nLastButtonDown = IDM_NEW;
  731. SetCapture(hWnd);
  732. InvalidateRect(hWnd, &stNewQuery, TRUE);
  733. InvalidateRect(hWndStatusbar, &rectStatusText, TRUE);
  734. }
  735. else if (PtInRect(&stRunQuery, stMousePosition))
  736. {
  737. bRunQueryBtnDown = TRUE;
  738. wStatusText = nLastButtonDown = IDM_QUERY;
  739. SetCapture(hWnd);
  740. InvalidateRect(hWnd, &stRunQuery, TRUE);
  741. InvalidateRect(hWndStatusbar, &rectStatusText, TRUE);
  742. }
  743. break;
  744. case WM_LBUTTONUP:
  745. // check if the mouse movements from key down movements
  746. // were captured, if so process the key release state.
  747. // if the key was released in the same button where it
  748. // was pressed, it is equivalent to a button click.
  749. if (hWnd != GetCapture())
  750. break;
  751. stMousePosition.x = LOWORD(lParam);
  752. stMousePosition.y = HIWORD(lParam);
  753. if (bNewQueryBtnDown && PtInRect(&stNewQuery, stMousePosition))
  754. {
  755. bNewQueryBtnDown = FALSE;
  756. nLastButtonDown = 0;
  757. InvalidateRect(hWnd, &stNewQuery, TRUE);
  758. PostMessage(hWndFrame, WM_COMMAND, GET_WM_COMMAND_MPS(IDM_NEW, 0, 0));
  759. SendMessage(hWndCrsrList, CB_SHOWDROPDOWN, (WPARAM)FALSE, 0);
  760. SendMessage(hWndStmtList, CB_SHOWDROPDOWN, (WPARAM)FALSE, 0);
  761. }
  762. else if (bRunQueryBtnDown && PtInRect(&stRunQuery, stMousePosition))
  763. {
  764. bRunQueryBtnDown = FALSE;
  765. nLastButtonDown = 0;
  766. InvalidateRect(hWnd, &stRunQuery, TRUE);
  767. PostMessage(hWndFrame, WM_COMMAND, GET_WM_COMMAND_MPS(IDM_QUERY, 0, 0));
  768. SendMessage(hWndCrsrList, CB_SHOWDROPDOWN, (WPARAM)FALSE, 0);
  769. SendMessage(hWndStmtList, CB_SHOWDROPDOWN, (WPARAM)FALSE, 0);
  770.                 }
  771. ReleaseCapture();
  772. wStatusText = 0;
  773. InvalidateRect(hWndStatusbar, &rectStatusText, TRUE);
  774. break;
  775. case WM_MOUSEMOVE:
  776.                 
  777.         // process mouse movement only if the mouse key was pressed
  778.         // down and its movements were being captured. If the mouse
  779.         // moves outside of the currently depressed button, it needs
  780.         // to be drawn again with normal state.
  781. if (hWnd != GetCapture())
  782. break;
  783. stMousePosition.x = LOWORD(lParam);
  784. stMousePosition.y = HIWORD(lParam);
  785. if (nLastButtonDown == IDM_NEW)
  786. {
  787. bButtonPosition = PtInRect(&stNewQuery, stMousePosition);
  788. if (bNewQueryBtnDown != bButtonPosition)
  789. {
  790. bNewQueryBtnDown = bButtonPosition;
  791. InvalidateRect(hWnd, &stNewQuery, TRUE);
  792. }
  793. }
  794. else if (nLastButtonDown == IDM_QUERY)
  795. {
  796. bButtonPosition = PtInRect(&stRunQuery, stMousePosition);
  797. if (bRunQueryBtnDown != bButtonPosition)
  798. {
  799. bRunQueryBtnDown = bButtonPosition;
  800. InvalidateRect(hWnd, &stRunQuery, TRUE);
  801. }
  802. }
  803. break;
  804. case WM_PAINT:
  805.                 {
  806. PAINTSTRUCT ps; //paint structure
  807. RECT rect; //rectangle for tool bar
  808. HDC hDC; //device context handle
  809. int iWidth; //tool bar width
  810. int iHeight; //tool bar height
  811. HPEN hLtGrayPen; //buttonface color pen
  812. HPEN hGrayPen; //buttonshadow color pen
  813. int btnx; //button x coordinate position
  814.                                 
  815. if (!(hDC = BeginPaint(hWnd, &ps)))
  816. break;
  817. GetClientRect(hWnd, &rect);
  818. iWidth = rect.right;
  819. iHeight = rect.bottom;
  820. hLtGrayPen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_BTNFACE));
  821. hGrayPen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));
  822.                 
  823.         // draw background and border
  824. SelectObject(hDC, GetStockObject(LTGRAY_BRUSH));
  825. SelectObject(hDC, hLtGrayPen);
  826. Rectangle(hDC, 0, 0, iWidth, iHeight);
  827. SelectObject(hDC, GetStockObject(BLACK_PEN));
  828. MoveToEx(hDC, 0, iHeight-1, NULL);
  829. LineTo(hDC, iWidth, iHeight-1);
  830. SelectObject(hDC, GetStockObject(WHITE_PEN));
  831. MoveToEx(hDC, 0, 0, NULL);
  832. LineTo(hDC, iWidth, 0);
  833. // draw tool bar buttons (new query, run query)
  834.         // check state variables to draw proper button state
  835. btnx = BTTNX;
  836. SelectObject(hDC, GetStockObject(BLACK_PEN));
  837. DRAWBTTNRECT(hDC, btnx, BTTNY, BTTNWIDTH, BTTNHEIGHT);
  838. DrawBitmap(hDC, (bNewQueryBtnDown?btnx+3:btnx+2), (bNewQueryBtnDown?BTTNY+3:BTTNY+2), hbmpNewQuery);
  839. SelectObject(hDC, (bNewQueryBtnDown ? hGrayPen : GetStockObject(WHITE_PEN)));
  840. DRAWBTTNLIFT1(hDC, btnx, BTTNY, BTTNWIDTH, BTTNHEIGHT);
  841. SelectObject(hDC, (bNewQueryBtnDown ? hLtGrayPen : hGrayPen));
  842. DRAWBTTNLIFT2(hDC, btnx, BTTNY, BTTNWIDTH, BTTNHEIGHT);
  843. btnx += BTTNWIDTH+BTTNMARGIN;
  844. SelectObject(hDC, GetStockObject(BLACK_PEN));
  845. DRAWBTTNRECT(hDC, btnx, BTTNY, BTTNWIDTH, BTTNHEIGHT);
  846. DrawBitmap(hDC, (bRunQueryBtnDown?btnx+3:btnx+2), (bRunQueryBtnDown?BTTNY+3:BTTNY+2), hbmpRunQuery);
  847. SelectObject(hDC, (bRunQueryBtnDown ? hGrayPen : GetStockObject(WHITE_PEN)));
  848. DRAWBTTNLIFT1(hDC, btnx, BTTNY, BTTNWIDTH, BTTNHEIGHT);
  849. SelectObject(hDC, (bRunQueryBtnDown ? hLtGrayPen : hGrayPen));
  850. DRAWBTTNLIFT2(hDC, btnx, BTTNY, BTTNWIDTH, BTTNHEIGHT);
  851. SelectObject(hDC, GetStockObject(WHITE_PEN));
  852. EndPaint(hWnd, &ps);
  853. // delete create objects
  854. if (hLtGrayPen)
  855. DeleteObject(hLtGrayPen);
  856. if (hGrayPen)
  857. DeleteObject(hGrayPen);
  858. break;
  859.                 }
  860.                 
  861. default:
  862. return (DefWindowProc(hWnd, message, wParam, lParam));
  863. }
  864. return (0);
  865. }
  866. /*
  867. FUNCTION: StatusbarProc(HWND hWnd, UINT   message, WPARAM wParam, LPARAM lParam)
  868. COMMENTS: callback window procedure for status bar.
  869.   process paint messages and timer messages to update current
  870.   state, date and time
  871. */
  872. long CALLBACK StatusbarProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  873. {
  874. switch (message)
  875. {
  876. static RECT DateTimeRect; // remember for frequent updates
  877. case WM_CREATE:
  878.                 {
  879. HDC hDC; // device context
  880. SIZE sizeText;       // size of status text box
  881. SIZE sizeTime;       // size of time display box
  882. SIZE sizeDate;       // size of date display box
  883.                 
  884.         // start a timer for periodic updates to date and time display
  885.         // find out width of status text, date and time display boxes
  886. SetTimer(hWnd,  (UINT)IDT_STATUSTIMER, (UINT)TIMERDELAY, NULL);
  887. iTimex = iDatex = 0;
  888. rectStatusText.left = 2;
  889. rectStatusText.top = 3;
  890. if (hDC = GetDC(hWnd))
  891. {
  892. GetTextExtentPoint(hDC, STATUSCONSTRAINT_COLUMN_USAGE, strlen(STATUSCONSTRAINT_COLUMN_USAGE), &sizeText);
  893. GetTextExtentPoint(hDC, TIMETEXT, strlen(TIMETEXT), &sizeTime);
  894. GetTextExtentPoint(hDC, DATETEXT, strlen(DATETEXT), &sizeDate);
  895. ReleaseDC(hWnd, hDC);
  896. rectStatusText.right = sizeText.cx + rectStatusText.left;
  897. iTimex = sizeTime.cx;
  898. iDatex = sizeDate.cx;
  899. }
  900. break;
  901.                 }
  902.                 
  903. case WM_TIMER:
  904. // invalidate only the date&time area for update
  905.   InvalidateRect(hWnd, &DateTimeRect, TRUE);
  906. break;
  907. case WM_PAINT:
  908.                 {
  909. HDC hDC; //device context
  910. PAINTSTRUCT ps; //paint structure
  911. RECT rect;               //status bar rect
  912. int iWidth;             //status bar width
  913. int iHeight;            //status bar height
  914. HPEN hLtGrayPen;         //btnface color pen
  915. HPEN hGrayPen;           //btnshadow color pen
  916. char szText[MAXBUFLEN];  //text buffer for display
  917. time_t tCurrentTime;       //current date&time
  918. struct tm stTime;             //date&time structure
  919. if (!(hDC = BeginPaint(hWnd, &ps)))
  920. break;
  921. GetClientRect(hWnd, &rect);
  922. iWidth = rect.right;
  923. iHeight = rect.bottom;
  924. rectStatusText.bottom = iHeight-2;
  925. hLtGrayPen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_BTNFACE));
  926. hGrayPen = CreatePen(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));
  927. // paint background and border
  928. SelectObject(hDC, GetStockObject(LTGRAY_BRUSH));
  929. SelectObject(hDC, hLtGrayPen);
  930. Rectangle(hDC, 0, 0, iWidth, iHeight);
  931. SelectObject(hDC, GetStockObject(BLACK_PEN));
  932. MoveToEx(hDC, 0, 0, NULL);
  933. LineTo(hDC, iWidth, 0);
  934. SelectObject(hDC, GetStockObject(WHITE_PEN));
  935. MoveToEx(hDC, 0, 1, NULL);
  936. LineTo(hDC, iWidth, 1);
  937.                 
  938.         // draw text boxes for status, time and date display
  939.         SelectObject(hDC, hGrayPen);
  940.         MoveToEx(hDC, rectStatusText.left, rectStatusText.bottom, NULL);
  941.         LineTo(hDC, rectStatusText.left, rectStatusText.top);
  942.         LineTo(hDC, rectStatusText.right, rectStatusText.top);
  943.         SelectObject(hDC, GetStockObject(WHITE_PEN));
  944.         LineTo(hDC, rectStatusText.right, rectStatusText.bottom);
  945.         LineTo(hDC, rectStatusText.left, rectStatusText.bottom);
  946.         
  947.         SelectObject(hDC, hGrayPen);
  948.         MoveToEx(hDC, iWidth-2, 3, NULL);
  949.         LineTo(hDC, iWidth-iDatex-2, 3);
  950.         LineTo(hDC, iWidth-iDatex-2, iHeight-2);
  951.         SelectObject(hDC, GetStockObject(WHITE_PEN));
  952.         LineTo(hDC, iWidth-2, iHeight-2);
  953.         LineTo(hDC, iWidth-2, 3);
  954.         
  955.         SelectObject(hDC, hGrayPen);
  956.         MoveToEx(hDC, iWidth-iDatex-6, 3, NULL);
  957.         LineTo(hDC, iWidth-iTimex-iDatex-6, 3);
  958.         LineTo(hDC, iWidth-iTimex-iDatex-6, iHeight-2);
  959.         SelectObject(hDC, GetStockObject(WHITE_PEN));
  960.         LineTo(hDC, iWidth-iDatex-6, iHeight-2);
  961.         LineTo(hDC, iWidth-iDatex-6, 3);
  962. // draw status text in the display box based on current
  963. // value of wStatusText global flag
  964. SetBkMode(hDC, TRANSPARENT);
  965. SetTextColor(hDC, GetSysColor(COLOR_BTNTEXT));
  966. switch (wStatusText)
  967. {
  968. case IDM_POPUPAPPSYS:
  969. strcpy(szText, STATUSPOPUPAPPSYS);
  970. break;
  971. case IDM_POPUPMDISYS:
  972. strcpy(szText, STATUSPOPUPMDISYS);
  973. break;
  974. case SC_RESTORE:
  975. strcpy(szText, STATUSRESTORE);
  976. break;
  977. case SC_MOVE:
  978. strcpy(szText, STATUSMOVE);
  979. break;
  980. case SC_SIZE:
  981. strcpy(szText, STATUSSIZE);
  982. break;
  983. case SC_MINIMIZE:
  984. strcpy(szText, STATUSMINIMIZE);
  985. break;
  986. case SC_MAXIMIZE:
  987. strcpy(szText, STATUSMAXIMIZE);
  988. break;
  989. case SC_CLOSE:
  990. strcpy(szText, STATUSCLOSE);
  991. break;
  992. case SC_NEXTWINDOW:
  993. strcpy(szText, STATUSNEXTWINDOW);
  994. break;
  995. case SC_PREVWINDOW:
  996. strcpy(szText, STATUSPREVWINDOW);
  997. break;
  998. case SC_TASKLIST:
  999. strcpy(szText, STATUSTASKLIST);
  1000. break;
  1001. case IDM_POPUPLOGIN:
  1002. strcpy(szText, STATUSPOPUPLOGIN);
  1003. break;
  1004. case IDM_INITIALIZE:
  1005. strcpy(szText, STATUSCONNECT);
  1006. break;
  1007. case IDM_DISCONNECT:
  1008. strcpy(szText, STATUSDISCONNECT);
  1009. break;
  1010. case IDM_EXIT:
  1011. strcpy(szText, STATUSEXIT);
  1012. break;
  1013. case IDM_POPUPQUERY:
  1014. strcpy(szText, STATUSPOPUPQUERY);
  1015. break;
  1016.         case IDM_QUERY:
  1017.         
  1018.         strcpy(szText, STATUSQUERY);
  1019.         break;
  1020. case IDM_NEW:
  1021.         
  1022.          strcpy(szText, STATUSNEW);
  1023. break;
  1024. case IDM_POPUPSCHEMA:
  1025. strcpy(szText, STATUSPOPUPSCHEMA);
  1026. break;
  1027. case IDM_POPUPWINDOW:
  1028. strcpy(szText, STATUSPOPUPWINDOW);
  1029. break;
  1030. case IDM_TILE:
  1031. strcpy(szText, STATUSTILE);
  1032. break;
  1033. case IDM_CASCADE:
  1034. strcpy(szText, STATUSCASCADE);
  1035. break;
  1036. case IDM_ICONS:
  1037. strcpy(szText, STATUSICONS);
  1038. break;
  1039. case IDM_CLOSEALL:
  1040. strcpy(szText, STATUSCLOSEALL);
  1041. break;
  1042. case IDM_POPUPHELP:
  1043. strcpy(szText, STATUSPOPUPHELP);
  1044. break;
  1045. case IDM_APPHELP:
  1046. strcpy(szText, STATUSAPPHELP);
  1047. break;
  1048. case IDM_ABOUT:
  1049. strcpy(szText, STATUSABOUT);
  1050. break;
  1051. case IDM_ASSERTIONS: 
  1052. strcpy(szText, STATUSASSERTIONS);
  1053. break;
  1054. case IDM_CATALOGS: 
  1055. strcpy(szText, STATUSCATALOGS);
  1056. break;
  1057. case IDM_CHARACTER_SETS: 
  1058. strcpy(szText, STATUSCHARACTER_SETS);
  1059. break;
  1060. case IDM_CHECK_CONSTRAINTS:
  1061. strcpy(szText, STATUSCHECK_CONSTRAINTS);
  1062. break;
  1063. case IDM_COLLATIONS: 
  1064. strcpy(szText, STATUSCOLLATIONS);
  1065. break;
  1066. case IDM_COLUMN_DOMAIN_USAGE: 
  1067. strcpy(szText, STATUSCOLUMN_DOMAIN_USAGE);
  1068. break;
  1069. case IDM_COLUMN_PRIVILEGES: 
  1070. strcpy(szText, STATUSCOLUMN_PRIVILEGES);
  1071. break;
  1072. case IDM_COLUMNS: 
  1073. strcpy(szText, STATUSCOLUMNS);
  1074. break;
  1075. case IDM_CONSTRAINT_COLUMN_USAGE: 
  1076. strcpy(szText, STATUSCONSTRAINT_COLUMN_USAGE);
  1077. break;
  1078. case IDM_CONSTRAINT_TABLE_USAGE: 
  1079. strcpy(szText, STATUSCONSTRAINT_TABLE_USAGE);
  1080. break;
  1081. case IDM_FOREIGN_KEYS: 
  1082. strcpy(szText, STATUSFOREIGN_KEYS);
  1083. break;
  1084. case IDM_INDEXES: 
  1085. strcpy(szText, STATUSINDEXES);
  1086. break;
  1087. case IDM_KEY_COLUMN_USAGE: 
  1088. strcpy(szText, STATUSKEY_COLUMN_USAGE);
  1089. break;
  1090. case IDM_PRIMARY_KEYS: 
  1091. strcpy(szText, STATUSPRIMARY_KEYS);
  1092. break;
  1093. case IDM_PROCEDURE_COLUMNS: 
  1094. strcpy(szText, STATUSPROCEDURE_COLUMNS);
  1095. break;
  1096. case IDM_PROCEDURE_PARAMETERS: 
  1097. strcpy(szText, STATUSPROCEDURE_PARAMETERS);
  1098. break;
  1099. case IDM_PROCEDURES: 
  1100. strcpy(szText, STATUSPROCEDURES);
  1101. break;
  1102. case IDM_PROVIDER_TYPES: 
  1103. strcpy(szText, STATUSPROVIDER_TYPES);
  1104. break;
  1105. case IDM_REFERENTIAL_CONSTRAINTS: 
  1106. strcpy(szText, STATUSREFERENTIAL_CONSTRAINTS);
  1107. break;
  1108. case IDM_SCHEMATA: 
  1109. strcpy(szText, STATUSSCHEMATA);
  1110. break;
  1111. case IDM_SQL_LANGUAGES: 
  1112. strcpy(szText, STATUSSQL_LANGUAGES);
  1113. break;
  1114. case IDM_STATISTICS: 
  1115. strcpy(szText, STATUSSTATISTICS);
  1116. break;
  1117. case IDM_TABLE_CONSTRAINTS: 
  1118. strcpy(szText, STATUSTABLE_CONSTRAINTS);
  1119. break;
  1120. case IDM_TABLE_PRIVILEGES: 
  1121. strcpy(szText, STATUSTABLE_PRIVILEGES);
  1122. break;
  1123. case IDM_TABLES: 
  1124. strcpy(szText, STATUSTABLES);
  1125. break;
  1126. case IDM_TRANSLATIONS: 
  1127. strcpy(szText, STATUSTRANSLATIONS);
  1128. break;
  1129. case IDM_USAGE_PRIVILEGES: 
  1130. strcpy(szText, STATUSUSAGE_PRIVILEGES);
  1131. break;
  1132. case IDM_VIEW_COLUMN_USAGE: 
  1133. strcpy(szText, STATUSVIEW_COLUMN_USAGE);
  1134. break;
  1135. case IDM_VIEW_TABLE_USAGE: 
  1136. strcpy(szText, STATUSVIEW_TABLE_USAGE);
  1137. break;
  1138. case IDM_VIEWS: 
  1139. strcpy(szText, STATUSVIEWS);
  1140. break;
  1141. default:
  1142.                         
  1143.             if (wStatusText >= IDM_MDICHILD)
  1144.              sprintf(szText, STATUSMDICHILD, wStatusText-IDM_MDICHILD+1);
  1145.             else
  1146.          strcpy(szText, STATUSDEFAULT);
  1147. break;
  1148. }
  1149. DrawText(hDC, szText, strlen(szText), &rectStatusText, DT_LEFT);
  1150.                 
  1151.     // get current date and time and display time in time box
  1152. time(&tCurrentTime);
  1153. stTime = *localtime(&tCurrentTime);
  1154. strftime(szText, MAXBUFLEN, TIMEFORMAT, &stTime);
  1155. rect.top = rectStatusText.top;
  1156. rect.bottom = rectStatusText.bottom;
  1157. rect.left  = iWidth-iTimex-iDatex-6;
  1158. rect.right = iWidth-iDatex-6;
  1159. DrawText(hDC, szText, strlen(szText), &rect, DT_LEFT);
  1160. // display date in date box
  1161. strftime(szText, MAXBUFLEN, DATEFORMAT, &stTime);
  1162. rect.left  = iWidth-iDatex-2;
  1163. rect.right = iWidth-2;
  1164. DrawText(hDC, szText, strlen(szText), &rect, DT_LEFT);
  1165. // remember the date&time rectangle to minimize painting
  1166. DateTimeRect.left   = iWidth-iTimex-iDatex-6;
  1167. DateTimeRect.right  = iWidth-2;
  1168. DateTimeRect.top    = rect.top;
  1169. DateTimeRect.bottom = rect.bottom;
  1170. EndPaint(hWnd, &ps);
  1171. // delete created objects
  1172. if (hLtGrayPen)
  1173. DeleteObject(hLtGrayPen);
  1174. if (hGrayPen)
  1175. DeleteObject(hGrayPen);
  1176. break;
  1177.                 }
  1178.                 
  1179. default:
  1180. return (DefWindowProc(hWnd, message, wParam, lParam));
  1181. break;
  1182. }
  1183. return (0);
  1184. }
  1185. /*
  1186. FUNCTION: ConnectDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  1187. COMMENTS: Callback dialog box procedure for connect menu command
  1188.   displays a list of available data sources, asks for user
  1189.   name and password to pass default connection parameters
  1190.   for a data source connection
  1191. */
  1192. BOOL CALLBACK ConnectDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  1193. {
  1194. switch (message)
  1195. {
  1196. HCURSOR hOldCursor; // Default Cursor Shape
  1197. case WM_INITDIALOG:
  1198.                 
  1199.         // display list of available providers
  1200. hOldCursor = SetCursor(LoadCursor((HINSTANCE)NULL, IDC_WAIT));
  1201. DisplayProviders(GetDlgItem(hWnd, IDCOMBO_PROVIDER));
  1202. // DisplayDataSource(hWnd);
  1203. FillPrompt(GetDlgItem(hWnd, IDCOMBO_PROMPT));
  1204. SetCursor(hOldCursor);
  1205. break;
  1206. case WM_COMMAND:
  1207. switch (GET_WM_COMMAND_ID(wParam, lParam))
  1208. {
  1209. // Make a connection using the supplied values
  1210. case IDOK:
  1211. hOldCursor = SetCursor(LoadCursor((HINSTANCE)NULL, IDC_WAIT));
  1212.             // Check if a DSO was provided for connection
  1213. if( ConnectDatabase(hWnd) )
  1214. EndDialog(hWnd, TRUE);
  1215. SetCursor(hOldCursor);
  1216. break;
  1217. case IDCANCEL:
  1218. EndDialog(hWnd, FALSE);
  1219. break;
  1220. default:
  1221. return (FALSE);
  1222. break;
  1223. }
  1224. break;
  1225. default:
  1226. return (FALSE);
  1227. break;
  1228. }
  1229. return (TRUE);
  1230. }
  1231. /*
  1232. FUNCTION: DisconnectDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  1233. COMMENTS: Callback dialog box procedure for disconnect dialog.
  1234.   provides a list of available SESSIONs and a list of HSTMTs
  1235.   for currently selected SESSION. Allows closure of all SESSIONs
  1236.   and HSTMTs one by one or in groups.
  1237. */
  1238. BOOL CALLBACK DisconnectDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  1239. {
  1240. switch (message)
  1241. {
  1242. static HWND hListhdbc; //listbox that displays hdbc(s)
  1243. static HWND hListstmt;      //listbox that displays hstmt(s)
  1244. static HWND hPushOk;        //pushbutton to free hdbc
  1245. static HWND hPushClose;     //pushbutton to free hstmt
  1246. static HWND hPushCancel;    //pushbutton to close dialog
  1247. case WM_INITDIALOG:
  1248. // store handles for future reference
  1249. hListhdbc = GetDlgItem(hWnd, IDLIST_SESSION);
  1250. hListstmt = GetDlgItem(hWnd, IDLIST_COMMAND);
  1251. hPushOk = GetDlgItem(hWnd, IDDISCONNECT);
  1252. hPushCancel = GetDlgItem(hWnd, IDCANCEL);
  1253. hPushClose = GetDlgItem(hWnd, IDCLOSE_ACTVTY);
  1254. // display connected database handles and statements
  1255. DisplayConnections(hListhdbc);
  1256. DisplayICommands(hListstmt, hListhdbc, 0);
  1257. // enable or disable pushbuttons & listboxes to match available hdbc & hstmt
  1258. if (SendMessage(hListhdbc, LB_GETCOUNT, 0, 0)>0)
  1259. {
  1260. EnableWindow(hPushOk, TRUE);
  1261. if (SendMessage(hListstmt, LB_GETCOUNT, 0, 0)>0)
  1262. {
  1263. EnableWindow(hPushClose, TRUE);
  1264. SetFocus(hPushClose);
  1265. SendMessage(hPushClose, BM_SETSTYLE, (WPARAM)BS_DEFPUSHBUTTON, TRUE);
  1266. }
  1267. else
  1268. {
  1269. EnableWindow(hListstmt, FALSE);
  1270. EnableWindow(hPushClose, FALSE);
  1271. SetFocus(hPushOk);
  1272. SendMessage(hPushOk, BM_SETSTYLE, (WPARAM)BS_DEFPUSHBUTTON, TRUE);
  1273. }
  1274. }
  1275. else
  1276. {
  1277. EnableWindow(hListhdbc, FALSE);
  1278. EnableWindow(hListstmt, FALSE);
  1279. EnableWindow(hPushOk, FALSE);
  1280. SetFocus(hPushCancel);
  1281. SendMessage(hPushCancel, BM_SETSTYLE, (WPARAM)BS_DEFPUSHBUTTON, TRUE);
  1282. }
  1283. // return FALSE to prevent default focus.
  1284. return (FALSE);
  1285. case WM_COMMAND:
  1286. switch (GET_WM_COMMAND_ID(wParam, lParam))
  1287. {
  1288. case IDDISCONNECT:
  1289.                         
  1290.             // Free current hdbc, display available hdbc(s)
  1291. FreeConnect(hListhdbc);
  1292. SendMessage(hListstmt, LB_RESETCONTENT, 0, 0);
  1293. DisplayConnections(hListhdbc);
  1294.                         
  1295.             // update displayed hstmt(s) for current hdbc
  1296.             // enable or disable pushbuttons to match available
  1297.             // hdbc(s) and hstmt(s) for closure
  1298. if (SendMessage(hListhdbc, LB_GETCOUNT, 0, 0) > 0)
  1299. {
  1300. SendMessage(hListhdbc, LB_SETCURSEL, 0, 0);
  1301. EnableWindow(hListstmt, TRUE);
  1302. DisplayICommands(hListstmt, hListhdbc, 0);
  1303. if (SendMessage(hListstmt, LB_GETCOUNT, 0, 0)>0)
  1304. {
  1305. EnableWindow(hPushClose, TRUE);
  1306. SetFocus(hPushClose);
  1307. SendMessage(hPushClose, BM_SETSTYLE, (WPARAM)BS_DEFPUSHBUTTON, TRUE);
  1308. }
  1309. else
  1310. {
  1311. EnableWindow(hListstmt, FALSE);
  1312. EnableWindow(hPushClose, FALSE);
  1313. SetFocus(hPushOk);
  1314. SendMessage(hPushOk, BM_SETSTYLE, (WPARAM)BS_DEFPUSHBUTTON, TRUE);
  1315. }
  1316. }
  1317. else
  1318. {
  1319. EnableWindow(hListhdbc, FALSE);
  1320. EnableWindow(hPushOk, FALSE);
  1321. EnableWindow(hPushClose, FALSE);
  1322. SetFocus(hPushCancel);
  1323. SendMessage(hPushCancel, BM_SETSTYLE, (WPARAM)BS_DEFPUSHBUTTON, TRUE);
  1324. }
  1325. break;
  1326. case IDCANCEL:
  1327. // close dialog
  1328. EndDialog(hWnd, FALSE);
  1329. break;
  1330. case IDCLOSE_ACTVTY:
  1331.                         {
  1332. int nIndex; // counter to search for selected hstmt(s)
  1333. // go through all displayed hstmt(s) and free all highlighted ones
  1334. for (nIndex = (int)SendMessage(hListstmt, LB_GETCOUNT, 0, 0)-1;
  1335. nIndex >= 0; nIndex--)
  1336. if (SendMessage(hListstmt, LB_GETSEL, nIndex, 0))
  1337. FreeICommand(hListstmt, hListhdbc, nIndex);
  1338. // reset both hdbc(s) and hstmt(s) display
  1339. nIndex = (int)SendMessage(hListhdbc, LB_GETCURSEL, 0, 0);
  1340. DisplayConnections(hListhdbc);
  1341. SendMessage(hListhdbc, LB_SETCURSEL, nIndex, 0);
  1342. DisplayICommands(hListstmt, hListhdbc, nIndex);
  1343. // enable or disable pushbuttons to match available
  1344. // hdbc(s) and hstmt(s) for closure
  1345. if (SendMessage(hListstmt, LB_GETCOUNT, 0, 0)>0)
  1346. {
  1347. EnableWindow(hPushClose, TRUE);
  1348. SetFocus(hPushClose);
  1349. SendMessage(hPushClose, BM_SETSTYLE, (WPARAM)BS_DEFPUSHBUTTON, TRUE);
  1350. }
  1351. else
  1352. {
  1353. EnableWindow(hListstmt, FALSE);
  1354. EnableWindow(hPushClose, FALSE);
  1355. SetFocus(hPushOk);
  1356. SendMessage(hPushOk, BM_SETSTYLE, (WPARAM)BS_DEFPUSHBUTTON, TRUE);
  1357. }
  1358. break;
  1359.                         }
  1360.                         
  1361. case IDLIST_SESSION:
  1362. // If the current selection in hdbc(s) has changed
  1363. // update the list of hstmt(s) to match the new hdbc
  1364. if (GET_WM_COMMAND_CMD(wParam, lParam) == LBN_SELCHANGE)
  1365. DisplayICommands(hListstmt, hListhdbc,
  1366. (UINT)SendMessage(GET_WM_COMMAND_HWND(wParam, lParam), LB_GETCURSEL, 0, 0));
  1367.             // Enable or disable hstmt listbox and close pushbutton accordingly
  1368. EnableWindow(hListstmt, (SendMessage(hListstmt, LB_GETCOUNT, 0, 0)>0));
  1369. EnableWindow(hPushClose, (SendMessage(hListstmt, LB_GETCOUNT, 0, 0)>0));
  1370. break;
  1371. default:
  1372. return (FALSE);
  1373. }
  1374. break;
  1375. default:
  1376. return (FALSE);
  1377. }
  1378. return (TRUE);
  1379. }
  1380. /*
  1381. FUNCTION: AboutDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  1382. COMMENTS: Callback dialog box procedure for About dialog box
  1383.   displays the about information and closes upon selection of
  1384.   ok button
  1385. */
  1386. BOOL CALLBACK AboutDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  1387. {
  1388. if (message == WM_COMMAND)
  1389. {
  1390. EndDialog(hWnd, TRUE);
  1391. return (TRUE);
  1392. }
  1393. else
  1394. return (FALSE);
  1395. }
  1396. /*
  1397. FUNCTION: MDIChildDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  1398. COMMENTS: Callback dialog box procedure for modeless child dialog box
  1399.   in each MDI Child Window. This dialog box simply processes
  1400.   the tab messages (by default) to allow switching from edit
  1401.   control (SQL Text) to list box control (Query results).
  1402. */
  1403. BOOL CALLBACK MDIChildDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  1404. {
  1405. return (FALSE);
  1406. }
  1407. /*
  1408. FUNCTION: DrawBitmap(HDC hDC, int iLeft, int iTop, HBITMAP hBitmap
  1409. COMMENTS: Draws a bitmap on given Device context with given bitmap
  1410.   handle at given location
  1411. */
  1412. VOID FAR PASCAL DrawBitmap(HDC hDC, int iLeft, int iTop, HBITMAP hBitmap)
  1413. {
  1414. HDC hMemDC; // Device Context in Memory
  1415. POINT stPoint;    // point structure for conversion from device to logical units
  1416. BITMAP stBitmap;
  1417.     HGDIOBJ hObject;
  1418.         
  1419.     // create a compatible device context in memory and select the bitmap
  1420.     // in to it.
  1421. if (!(hMemDC = CreateCompatibleDC(hDC))) return;
  1422. hObject = SelectObject(hMemDC, hBitmap);
  1423. SetMapMode(hMemDC, GetMapMode(hDC));
  1424. // Get bitmap size and convert it to logical units from device units.
  1425. GetObject(hBitmap, sizeof(BITMAP), &stBitmap);
  1426. stPoint.x = stBitmap.bmWidth;
  1427. stPoint.y = stBitmap.bmHeight;
  1428. DPtoLP(hDC, &stPoint, 1);
  1429. // bit block transfer the bitmap from memory device context to given
  1430. // device context at specified location
  1431. BitBlt(hDC, iLeft, iTop, stPoint.x, stPoint.y, hMemDC, 0, 0, SRCCOPY);
  1432.         
  1433.     // select original object in the memory device context and destroy it
  1434. SelectObject(hMemDC, hObject);
  1435. DeleteDC(hMemDC);
  1436. }
  1437. void FillPrompt(HWND hWnd)
  1438. {
  1439. const static LPCTSTR rgPrompts[] =
  1440. {
  1441. //The order is the same as the Actual DBPROMPT Values
  1442. "Not Set", // 0
  1443. "PROMPT", // 1 == DBPROMPT_PROMPT
  1444. "COMPLETE", // 2 == DBPROMPT_COMPLETE
  1445. "COMPLETEREQUIRED", // 3 == DBPROMPT_COMPLETEREQUIRED
  1446. "NOPROMPT" // 4 == DBPROMPT_NOPROMPT
  1447. };
  1448. for (int i=0;  i<sizeof(rgPrompts) / sizeof(rgPrompts[0]); i++)
  1449. SendMessage(hWnd, CB_ADDSTRING, 0, (LPARAM) (LPCTSTR) rgPrompts[i]);
  1450. SendMessage(hWnd, CB_SETCURSEL, (WPARAM) DBPROMPT_COMPLETE, 0L);
  1451. }
  1452. /********************************************* END OF FILE **************************************************/