|
|
/*++
* File name: * dialog.c * Contents: * Implements dialog boxes for add to/browse bitmap database --*/ #include <windows.h>
#include "..\lib\bmpdb.h"
#include "resource.h"
PBMPENTRY g_pBitmap; PGROUPENTRY g_pGrpList; PBMPENTRY g_pBmpList; char g_szAddTextId[256];
char szBuffer[1024] = "null";
/*++
* Function: * _StripLine * Description: * Strips trailing and leading white space cahracters * in a string * Arguments: * line - the string * Called by: * _AddGlyphDlgProc --*/ void _StripLine(char *line) { int last = strlen(line); char *first = line;
if (last) last--;
while(last && isspace(line[last])) { line[last] = 0; last--; }
while(isspace(*first)) first++;
if (line != first) memmove(line, first, strlen(first) + 1 ); }
/*++
* Function: * DrawGlyph * Description: * Draws the glyph (monochrome bitmap) g_pBitmap * in the client window area * Arguments: * hWnd - the handle to the window * Called by: * PaintGlyph --*/ void DrawGlyph (HWND hWnd) { HDC hDC = NULL; HDC glyphDC = NULL; HBITMAP hOldBmp; RECT rect; INT xCenter, yCenter; INT xSize, ySize;
if (!g_pBitmap) goto exitpt1;
GetClientRect (hWnd, &rect); hDC = GetDC (hWnd);
if ( !hDC ) goto exitpt;
glyphDC = CreateCompatibleDC(hDC);
if (!glyphDC) goto exitpt;
hOldBmp = SelectObject(glyphDC, g_pBitmap->hBitmap);
xSize = (g_pBitmap->xSize > (UINT)rect.right )?rect.right :g_pBitmap->xSize; ySize = (g_pBitmap->ySize > (UINT)rect.bottom)?rect.bottom:g_pBitmap->ySize;
xCenter = (rect.right - xSize) / 2; yCenter = (rect.bottom- ySize) / 2;
BitBlt(hDC, // Dest DC
xCenter, // Dest x
yCenter, // Dest y
xSize, // Width
ySize, // Height
glyphDC, // Source
0, // Src x
0, // Src y
SRCCOPY); // Rop
SelectObject(glyphDC, hOldBmp);
DeleteDC( glyphDC ); exitpt: if ( hDC ) ReleaseDC (hWnd, hDC); exitpt1: ; }
/*++
* Function: * PaintGlyph * Description: * Repaints the glyph. Usualy called on WM_PAINT message * Arguments: * hWnd - the window * Called by: * _CommentListClicked, _AddGlyphDlgProc, _BrowseDlgProc --*/ void PaintGlyph (HWND hWnd) { InvalidateRect (hWnd, NULL, TRUE); UpdateWindow (hWnd); DrawGlyph (hWnd); }
/*++
* Function: * _AddWideToLB * Description: * Adds wide string to list box * Arguments: * hwndLB - list box handle * wszString - string to add * Called by: * _DeleteItem, _BrowseDlgItem --*/ VOID _AddWideToLB(HWND hwndLB, LPCWSTR wszString) { char lpszString[256];
WideCharToMultiByte( CP_ACP, 0, wszString, -1, lpszString, sizeof(lpszString), NULL, NULL);
SendMessage(hwndLB, LB_ADDSTRING, 0, (LPARAM)lpszString); }
/*++
* Function: * _DeleteItem * Description: * Deletes an entry from the list box and database * Arguments: * hDlg - dialog handle * hWndIDList - list box with IDs * hWndCommentList - list box with comment strings * Called by: * _BrowseDlgItem --*/ VOID _DeleteItem(HWND hDlg, HWND hWndIDList, HWND hWndCommentList) { PGROUPENTRY pGroup; PBMPENTRY pBitmap; FOFFSET lBmpOffs; LRESULT iIDIndex, iCmntIndex, iIdx;
iIDIndex = SendMessage (hWndIDList, LB_GETCURSEL, 0, 0); iIdx = iCmntIndex = SendMessage (hWndCommentList, LB_GETCURSEL, 0, 0);
if (iIDIndex == LB_ERR || iCmntIndex == LB_ERR) goto exitpt;
pGroup = g_pGrpList; while(pGroup && iIDIndex) { pGroup = pGroup->pNext; iIDIndex--; }
pBitmap = g_pBmpList; while (pBitmap && iCmntIndex) { pBitmap = pBitmap->pNext; iCmntIndex --; }
if (!pBitmap || !pGroup) goto exitpt;
DeleteBitmapByPointer(pBitmap->FOffsMe); // Is this is the last bitmap in the group ?
if (iIdx == 0 && pBitmap->pNext == NULL) DeleteGroupByPointer(pGroup->FOffsMe); // Refresh the boxes
FreeGroupList(g_pGrpList); SendMessage(hWndIDList, LB_RESETCONTENT, 0, 0); g_pGrpList = GetGroupList(); pGroup = g_pGrpList; while (pGroup) { _AddWideToLB(hWndIDList, pGroup->WText); pGroup = pGroup->pNext; }
exitpt: ; }
/*++
* Function: * _IDListClicked * Description: * Processes selecting an item from the list box with IDs * Fills the comment list box * Arguments: * hDlg - handle to the dialog * hWndCommentList - list box with comments * hWndIDList - list box with IDs * Called by: * _BrowseDlgProc --*/ VOID _IDListClicked(HWND hDlg, HWND hWndCommentList, HWND hWndIDList) { LRESULT iIDIndex; PBMPENTRY pBitmap; PGROUPENTRY pGroup;
iIDIndex = SendMessage (hWndIDList, LB_GETCURSEL, 0, 0);
// Clear the comment list box
SendMessage(hWndCommentList, LB_RESETCONTENT, 0, 0); FreeBitmapList(g_pBmpList);
if (iIDIndex != LB_ERR) { LRESULT iIdx = iIDIndex;
// Find the choosen group
pGroup = g_pGrpList; while(pGroup && iIdx) { iIdx--; pGroup = pGroup->pNext; }
// Read the bitmap group
if (pGroup) { HDC hDC = GetDC(hDlg);
if ( hDC ) { pBitmap = g_pBmpList = GetBitmapList(hDC, pGroup->FOffsBmp); ReleaseDC(hDlg, hDC); while(pBitmap) { SendMessage (hWndCommentList, LB_ADDSTRING, 0, (LPARAM)pBitmap->szComment); pBitmap = pBitmap->pNext; } } } EnableWindow (GetDlgItem (hDlg, IDC_DELETE), FALSE); } }
/*++
* Function: * _CommentListClicked * Description: * Processes selecting an item from comment list box * Shows the bitmap under this comment and ID * Arguments: * hDlg - dialog handle * hWndGlyph - glyph window * hWndCommentList - list box with comments * Called by: * _BrowseDlgProc --*/ VOID _CommentListClicked(HWND hDlg, HWND hWndGlyph, HWND hWndCommentList) { LRESULT iCommIndex; PBMPENTRY pBitmap;
iCommIndex = SendMessage (hWndCommentList, LB_GETCURSEL, 0, 0);
g_pBitmap = NULL; if (iCommIndex != LB_ERR) { LRESULT iIdx = iCommIndex;
pBitmap = g_pBmpList; while (pBitmap && iIdx) { pBitmap = pBitmap->pNext; iIdx --; }
g_pBitmap = pBitmap;
EnableWindow (GetDlgItem (hDlg, IDC_DELETE), TRUE); } PaintGlyph (hWndGlyph); }
/*++
* Function: * _AddGlyphDlgProc * Description: * Processes the messages for Add Glyph dialog box * Arguments: * hDlg - dialog handle * uiMsg - message ID * wParam - word parameter * lParam - long parameter * Return value: * TRUE if the message is processed --*/ INT_PTR CALLBACK _AddGlyphDlgProc (HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) { static HWND hWndGlyph = NULL;
switch (uiMsg) { case WM_INITDIALOG: hWndGlyph = GetDlgItem (hDlg, IDC_GLYPH);
SendDlgItemMessage (hDlg, IDC_IDEDIT, EM_LIMITTEXT, (WPARAM)MAX_STRING_LENGTH, 0); SendDlgItemMessage (hDlg, IDC_COMMENT, EM_LIMITTEXT, (WPARAM)MAX_STRING_LENGTH, 0); return TRUE;
case WM_PAINT: PaintGlyph (hWndGlyph); break;
case WM_COMMAND: switch (LOWORD (wParam)) { case IDOK: GetDlgItemText ( hDlg, IDC_IDEDIT, g_szAddTextId, sizeof (g_szAddTextId) - 1 ); _StripLine(g_szAddTextId);
GetDlgItemText ( hDlg, IDC_COMMENT, g_pBitmap->szComment, sizeof (g_pBitmap->szComment) - 1 ); _StripLine(g_pBitmap->szComment);
if (!g_szAddTextId[0]) { MessageBox(hDlg, "Please enter ID !", "Warning", MB_OK); } else if (!g_pBitmap->szComment[0]) { MessageBox(hDlg, "Please enter comment !", "Warning", MB_OK); } else { EndDialog (hDlg, TRUE); } return TRUE;
case IDCANCEL: EndDialog (hDlg, FALSE); return TRUE; } }
return FALSE; }
/*++
* Function: * AddBitmapDialog * Description: * Pops an "Add Glyph(bitmap)" dialog * Arguments: * hInst - our instance * hWnd - main window handle * pBitmap - selected bitmap * Called by: * glyphspy.c!_ClickOnGlyph --*/ VOID AddBitmapDialog(HINSTANCE hInst, HWND hWnd, PBMPENTRY pBitmap) { g_pBitmap = pBitmap;
if (!g_pBitmap) goto exitpt;
if (DialogBox ( hInst, MAKEINTRESOURCE (IDD_ADDGLYPH), hWnd, _AddGlyphDlgProc )) { // Add the entry to the DB
if (!AddBitMapA(g_pBitmap, g_szAddTextId)) { MessageBox(hWnd, "Can't add the glyph to the database !", "Warning", MB_OK); } } exitpt: ; }
/*++
* Function: * _BrowseDlgProc * Description: * Processes the messages for "Browse Glyphs(bitmaps)" dialog * Arguments: * hDlg - dialog handle * uiMsg - message ID * wParam - word parameter * lParam - long parameter * Return value: * TRUE if the message is processed --*/ INT_PTR CALLBACK _BrowseDlgProc (HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) { static HWND hWndGlyph = NULL; static HWND hWndIDList = NULL; static HWND hWndCommentList = NULL; int i; int iIndex; PGROUPENTRY pGroup; BOOL rv = FALSE;
switch (uiMsg) { case WM_INITDIALOG: hWndGlyph = GetDlgItem (hDlg, IDC_GLYPH); hWndIDList = GetDlgItem (hDlg, IDC_IDLIST); hWndCommentList = GetDlgItem(hDlg, IDC_COMMENTLIST);
EnableWindow (GetDlgItem (hDlg, IDC_DELETE), FALSE);
g_pGrpList = GetGroupList(); pGroup = g_pGrpList; while (pGroup) { _AddWideToLB(hWndIDList, pGroup->WText); pGroup = pGroup->pNext; } rv = TRUE; break;
case WM_PAINT: PaintGlyph (hWndGlyph); break;
case WM_COMMAND: switch (LOWORD (wParam)) { case IDOK: EndDialog (hDlg, TRUE); rv = TRUE; break;
case IDC_DELETE: _DeleteItem(hDlg, hWndIDList, hWndCommentList); _IDListClicked(hDlg, hWndCommentList, hWndIDList); _CommentListClicked(hDlg, hWndGlyph, hWndCommentList); rv = TRUE; break;
case IDC_IDLIST: if (HIWORD (wParam) == LBN_SELCHANGE) { _IDListClicked(hDlg, hWndCommentList, hWndIDList); _CommentListClicked(hDlg, hWndGlyph, hWndCommentList); } rv = TRUE; break; case IDC_COMMENTLIST: if (HIWORD(wParam) == LBN_SELCHANGE) { _CommentListClicked(hDlg, hWndGlyph, hWndCommentList); } rv = TRUE; break; } }
return rv; }
/*++
* Function: * BrowseBitmapsDialog * Description: * Pops "Browse Glyphs(bitmaps) database" * Arguments: * hInst - our instance * hWnd - main window handle * Called by: * glyphspy.c!_GlyphSpyWndProc on ID_YEAH_BROWSE --*/ VOID BrowseBitmapsDialog(HINSTANCE hInst, HWND hWnd) {
g_pGrpList = NULL; g_pBitmap = NULL; g_pBmpList = NULL;
DialogBox ( hInst, MAKEINTRESOURCE (IDD_BROWSE), hWnd, _BrowseDlgProc );
FreeBitmapList(g_pBmpList); FreeGroupList(g_pGrpList); }
|