首页 > 代码库 > win32 便签

win32 便签

无聊做了一个桌面便签练手

刚学C++,所以代码风格还没改过来。。。

NotePin.h

 1  /*---------------------------------------- 2    Note Pin on your screen. 3                 (c) 2014 LJN 4   ----------------------------------------*/ 5  6 #include <windows.h> 7 #include <stack> 8  9 #define ID_EDIT        110 #define IDN_TRAY    211 12 #define IDM_TRAY    313 #define IDM_SHOW    414 #define IDM_QUIT    515 #define IDM_AUTO    616 17 #define WM_TRAY        WM_USER + 118 19 BOOL FileWrite (HWND hwndEdit, PTSTR pstrFileName);20 BOOL FileRead (HWND hwndEdit, PTSTR pstrFileName);21 22 class TextStack23 {24 private:25     std::stack <PTSTR> text;26 public:27     BOOL PushText (HWND hwndEdit);28     BOOL PopText (HWND hwndEdit);29     ~TextStack ();30 };

 

Main.cpp

  1  /*----------------------------------------  2    Note Pin on your screen.  3                 (c) 2014 LJN  4   ----------------------------------------*/  5   6 //Improve:    RegisterHotKey to Use global Hot Key  7 //            Introduce Redo  8   9 #include <windows.h> 10 #include "notepin.h" 11 #include "resource.h" 12  13 LRESULT    CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); 14 LRESULT CALLBACK TempProc (HWND, UINT, WPARAM, LPARAM); 15  16 WNDPROC OldProc; 17 BOOL    fUAC; 18  19 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, 20                     PSTR szCmdLine, int iCmdShow) 21 { 22     static TCHAR szAppName[] = TEXT ("Note-Pin"); 23     HWND        hwnd; 24     MSG            msg; 25     WNDCLASS    wndclass; 26     int            iWidth, iHeight; 27     HACCEL        hAccel; 28  29     wndclass.style            = CS_HREDRAW | CS_VREDRAW; 30     wndclass.lpfnWndProc    = WndProc; 31     wndclass.cbClsExtra        = 0; 32     wndclass.cbWndExtra        = 0; 33     wndclass.hInstance        = hInstance; 34     wndclass.hIcon            = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_ICON)); 35     wndclass.hCursor        = LoadCursor (NULL, IDC_ARROW); 36     wndclass.hbrBackground    = (HBRUSH) (COLOR_ACTIVEBORDER + 1); 37     wndclass.lpszMenuName    = NULL; 38     wndclass.lpszClassName    = szAppName; 39     RegisterClass (&wndclass); 40  41     iWidth = GetSystemMetrics (SM_CXSCREEN); 42     iHeight = GetSystemMetrics (SM_CYSCREEN); 43  44     fUAC = *szCmdLine==\0 ? FALSE : TRUE; 45  46     hwnd = CreateWindow (szAppName, TEXT ("Note-Pin"), 47                             WS_OVERLAPPED | WS_CAPTION | WS_THICKFRAME, 48                             360 * iWidth / 512,    313 * iHeight / 512, 49                             38 * iWidth / 128,    43 * iHeight / 128, 50                             NULL, NULL, hInstance, NULL); 51  52     ShowWindow (hwnd, iCmdShow); 53     UpdateWindow (hwnd); 54  55     hAccel = LoadAccelerators (hInstance,  MAKEINTRESOURCE (IDR_ACCELERATOR)); 56  57     while (GetMessage (&msg, NULL, 0, 0)) 58     { 59         if (!TranslateAccelerator (hwnd, hAccel, &msg)) 60         { 61             TranslateMessage (&msg); 62             DispatchMessage (&msg); 63         } 64     } 65     return (int) msg.wParam; 66 } 67  68  69 LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 70 { 71     static int    cxChar, cxCaps, cyChar; 72     TEXTMETRIC    tm; 73     HDC            hdc; 74     PAINTSTRUCT    ps; 75  76     static int                cxClient, cyClient; 77     static HINSTANCE        hInstance; 78     static HWND                hwndEdit; 79     static POINT            pt1, pt2; 80     static BOOL                fIsRestore = TRUE, fHide = FALSE , fAuto = FALSE; 81     static RECT                rect; 82     static HFONT            hFont; 83     static HMENU            hMenu; 84     static HKEY                hKey; 85     static NOTIFYICONDATA    Notify; 86     static SYSTEMTIME        st; 87      88     static TCHAR            szFullpath[MAX_PATH]; 89     static SHELLEXECUTEINFO    sei = {0}; 90  91     PTSTR    pTmp; 92     DWORD    cbSize, dType; 93     int        i; 94  95     WIN32_FILE_ATTRIBUTE_DATA    wfad; 96     FILETIME                    ftLocal; 97     TCHAR                        szBuffer[1000]; 98  99     static TextStack text;100 101     switch (message)102     {103     case WM_CREATE:104 105         hdc = GetDC (hwnd);106 107         GetTextMetrics (hdc, &tm);108         cxChar = tm.tmAveCharWidth;109         cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;110         cyChar = tm.tmHeight + tm.tmExternalLeading;111 112         ReleaseDC (hwnd, hdc);113 114         hInstance = ((LPCREATESTRUCT) lParam) -> hInstance;115         hwndEdit = CreateWindow (TEXT ("edit"), NULL,116                                 WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,117                                 0, 0, 0, 0, hwnd, (HMENU) ID_EDIT, hInstance, NULL);118 #ifndef _WIN64119         OldProc = (WNDPROC) SetWindowLong (hwndEdit, GWL_WNDPROC, (LPARAM) TempProc);120 #else121         OldProc = (WNDPROC) SetWindowLongPtr (hwndEdit, GWLP_WNDPROC, (LONG_PTR) TempProc);122 #endif123 124         GetModuleFileName (NULL, szFullpath, MAX_PATH);125         for (i = 0; i < lstrlen(szFullpath); i++)126             if (szFullpath[i] == .)127             if ((szFullpath[i+1] == e && szFullpath[i+2] == x && szFullpath[i+3] == e) || 128                 (szFullpath[i+1] == E && szFullpath[i+2] == X && szFullpath[i+3] == E))129                 break;130         for (; i > 0; i--)131             if (szFullpath[i] == \\)132                 break;133         lstrcpyn (szBuffer, szFullpath, i + 1);134         SetCurrentDirectory (szBuffer);135 136         fIsRestore &= FileRead (hwndEdit, TEXT ("TempStore.txt"));137         fIsRestore &= GetFileAttributesEx (TEXT ("TempStore.txt"), GetFileExInfoStandard, &wfad);138         fIsRestore &= FileTimeToLocalFileTime (&wfad.ftLastWriteTime, &ftLocal);139         fIsRestore &= FileTimeToSystemTime (&ftLocal, &st);140 141         hFont = CreateFont (-15, 0, 0, 0, 400, 0, 0, 0, 0, 142                             OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, FF_SWISS,143                             TEXT("Microsoft Sans Serif"));144         SendMessage (hwndEdit, WM_SETFONT, (WPARAM) hFont, 0);145         SendMessage (hwndEdit, EM_SETSEL, GetWindowTextLength (hwndEdit) + 1, GetWindowTextLength (hwndEdit) + 1);146         SendMessage (hwndEdit, EM_LINESCROLL, 0, SendMessage (hwndEdit, EM_GETLINECOUNT, 0, 0));147 148         hMenu = GetSystemMenu (hwnd, FALSE);149         DeleteMenu (hMenu, SC_MAXIMIZE,    MF_BYCOMMAND);150         DeleteMenu (hMenu, SC_MINIMIZE,    MF_BYCOMMAND);151         DeleteMenu (hMenu, SC_RESTORE,    MF_BYCOMMAND);152         AppendMenu (hMenu, MF_STRING,    IDM_QUIT,    TEXT ("Quit"));153 154         hMenu = CreatePopupMenu ();155         if (fUAC)    AppendMenu (hMenu, MF_STRING, IDM_AUTO, TEXT ("Auto Run"));156         else        AppendMenu (hMenu, MF_STRING, IDM_AUTO, TEXT ("Auto Run (UAC)"));157         AppendMenu (hMenu, MF_STRING, IDM_SHOW, TEXT ("Hide"));158         AppendMenu (hMenu, MF_SEPARATOR, 0, 0);159         AppendMenu (hMenu, MF_STRING, IDM_QUIT, TEXT ("Quit"));160 161         Notify.cbSize = (DWORD) sizeof (NOTIFYICONDATA);162         Notify.hWnd = hwnd;163         Notify.uID = IDN_TRAY;164         Notify.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;165         Notify.uCallbackMessage = WM_TRAY;166         Notify.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_ICON2));167         wcscpy_s (Notify.szTip, sizeof TEXT ("Note Pin"), TEXT ("Note Pin"));168         Shell_NotifyIcon (NIM_ADD, &Notify);169 170         if (fUAC)171         {172             RegOpenKey (HKEY_LOCAL_MACHINE, TEXT ("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"), &hKey);173             RegQueryValueEx (hKey, TEXT ("Note Pin"), 0, &dType, NULL, &cbSize);174             pTmp = (PTSTR) malloc (cbSize);175             RegQueryValueEx (hKey, TEXT ("Note Pin"), 0, &dType, (LPBYTE) pTmp, &cbSize);176             fAuto = lstrcmpi (szFullpath, pTmp) ? FALSE : TRUE;177             free (pTmp);178 179             if (fAuto)    ModifyMenu (hMenu, IDM_AUTO, MF_BYCOMMAND | MF_CHECKED, IDM_AUTO, TEXT ("Auto Run"));180             else        ModifyMenu (hMenu, IDM_AUTO, MF_BYCOMMAND | MF_UNCHECKED, IDM_AUTO, TEXT ("Auto Run"));181         }182         else183         {184             RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT ("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"),185                             0, KEY_QUERY_VALUE, &hKey);186             RegQueryValueEx (hKey, TEXT ("Note Pin"), 0, &dType, NULL, &cbSize);187             pTmp = (PTSTR) malloc (cbSize);188             RegQueryValueEx (hKey, TEXT ("Note Pin"), 0, &dType, (LPBYTE) pTmp, &cbSize);189             fAuto = lstrcmpi (szFullpath, pTmp) ? FALSE : TRUE;190             free (pTmp);191 192             if (fAuto)    ModifyMenu (hMenu, IDM_AUTO, MF_BYCOMMAND | MF_CHECKED, IDM_AUTO, TEXT ("Auto Run (UAC)"));193             else        ModifyMenu (hMenu, IDM_AUTO, MF_BYCOMMAND | MF_UNCHECKED, IDM_AUTO, TEXT ("Auto Run (UAC)"));194         }195         return 0;196 197     case WM_PAINT:198 199         hdc = BeginPaint (hwnd, &ps);200         SetBkMode (hdc, TRANSPARENT);201         SelectObject (hdc, hFont);202 203         fIsRestore &= GetFileAttributesEx (TEXT ("TempStore.txt"), GetFileExInfoStandard, &wfad);204         fIsRestore &= FileTimeToLocalFileTime (&wfad.ftLastWriteTime, &ftLocal);205         fIsRestore &= FileTimeToSystemTime (&ftLocal, &st);206 207         if (fIsRestore)208         {209             TextOut (hdc, cxChar, cyClient - cyChar * 17 / 16, szBuffer,210                     wsprintf (szBuffer, TEXT ("Last Edited: %4d/%#02d/%#02d  %#02d:%#02d:%#02d"),211                     st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond));212 213             TextOut (hdc, cxClient - (lstrlen (TEXT("© 2014 LJN")) + 1) * cxChar, cyClient - cyChar * 17 / 16,214                     TEXT("© 2014 LJN"), lstrlen (TEXT("© 2014 LJN")));215 216             MoveToEx  (hdc, 0, cyClient - cyChar * 35 / 32, NULL);217             LineTo    (hdc, cxClient, cyClient - cyChar * 35 / 32);218         }219         EndPaint (hwnd, &ps);220         221         if (fIsRestore)    MoveWindow (hwndEdit, 0, 0, cxClient, cyClient - cyChar * 18 / 16, TRUE);222         else            MoveWindow (hwndEdit, 0, 0, cxClient, cyClient, TRUE);223         return 0;224 225     case WM_SIZE:226 227         cxClient = LOWORD (lParam);228         cyClient = HIWORD (lParam);229         return 0;230 231     case WM_SETFOCUS:232 233         SetFocus (hwndEdit);234         return 0;235 236     case WM_TRAY:237 238         switch (lParam)239         {240         case WM_LBUTTONUP:241 242             if (fHide)243             {244                 ShowWindow (hwnd, SW_SHOW);245                 fHide = FALSE;246                 SetForegroundWindow (hwnd);247             }248             else249             {250                 FileWrite (hwndEdit, TEXT ("TempStore.txt"));251                 ShowWindow (hwnd, SW_HIDE);252                 fHide = TRUE;253             }            254             break;255 256         case WM_RBUTTONUP:257 258             if (fHide)    ModifyMenu (hMenu, IDM_SHOW, MF_BYCOMMAND | MF_STRING, IDM_SHOW, TEXT ("Restore"));259             else        ModifyMenu (hMenu, IDM_SHOW, MF_BYCOMMAND | MF_STRING, IDM_SHOW, TEXT ("Hide"));260 261             SetForegroundWindow (hwnd);262             GetCursorPos (&pt1);263             TrackPopupMenu (hMenu, TPM_RIGHTBUTTON, pt1.x, pt1.y, 0, hwnd, NULL);264             break;265         } 266         return 0;267 268     case WM_COMMAND:269     case WM_SYSCOMMAND:270 271         if (lParam && LOWORD (wParam) == ID_EDIT)272         {273             switch (HIWORD (wParam))274             {                275             case EN_ERRSPACE:276             case EN_MAXTEXT:277 278                 MessageBox (NULL, TEXT ("Too Many Characters!!!"), NULL, MB_ICONWARNING);279                 return 0;280 281             case EN_UPDATE:282 283                 text.PushText ((HWND) lParam);284                 return 0;285             }286             break;287         }288 289         switch (LOWORD (wParam))290         {291         case IDM_SELALL:292 293             SendMessage (hwndEdit, EM_SETSEL, 0, -1);294             return 0;295 296         case IDM_SAVE:297 298             FileWrite (hwndEdit, TEXT ("TempStore.txt"));299             fIsRestore = TRUE;300             InvalidateRect (hwnd, NULL, TRUE);301             return 0;302 303         case IDM_MY_UNDO:304 305             if (!text.PopText (hwndEdit)) MessageBeep (MB_ICONWARNING);306             SendMessage (hwndEdit, EM_SETSEL, GetWindowTextLength (hwndEdit) + 1, GetWindowTextLength (hwndEdit) + 1);307             SendMessage (hwndEdit, EM_LINESCROLL, 0, SendMessage (hwndEdit, EM_GETLINECOUNT, 0, 0));308             return 0;309 310         case IDM_SHOW:311 312             if (fHide)313             {314                 ShowWindow (hwnd, SW_SHOW);315                 fHide = FALSE;316                 SetForegroundWindow (hwnd);317             }318             else319             {320                 FileWrite (hwndEdit, TEXT ("TempStore.txt"));321                 ShowWindow (hwnd, SW_HIDE);322                 fHide = TRUE;323             }324             return 0;325 326         case IDM_AUTO:327 328             if (!fUAC)329             {330                 sei.cbSize = sizeof (SHELLEXECUTEINFO);331                 sei.lpVerb = TEXT ("runas");332                 sei.lpFile = szFullpath;333                 sei.lpParameters = TEXT ("runas");334                 sei.nShow = SW_SHOW;335 336                 if (ShellExecuteEx (&sei))337                     SendMessage (hwnd, WM_DESTROY, 0, 0);338             }339             else340             {341                 if (fAuto)342                 {343                     ModifyMenu (hMenu, IDM_AUTO, MF_BYCOMMAND | MF_UNCHECKED, IDM_AUTO, TEXT ("Auto Run"));344                     RegDeleteKeyValue (HKEY_LOCAL_MACHINE,345                                 TEXT ("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"), TEXT ("Note Pin"));346                     fAuto = FALSE;347                 }348                 else349                 {350                     ModifyMenu (hMenu, IDM_AUTO, MF_BYCOMMAND | MF_CHECKED, IDM_AUTO, TEXT ("Auto Run"));351                     RegSetValueEx (hKey, TEXT ("Note Pin"), 0, REG_SZ, (CONST BYTE*) szFullpath, (lstrlen (szFullpath) + 1) * 2);352                     fAuto = TRUE;353                 }354             }355             return 0;356 357         case IDM_QUIT:358 359             SendMessage (hwnd, WM_DESTROY, 0, 0);360             return 0;361         }362         break;363 364     case WM_CLOSE:365 366         if (!fHide)367         {368             ShowWindow (hwnd, SW_HIDE);369             FileWrite (hwndEdit, TEXT ("TempStore.txt"));370             fHide = TRUE;371         }372         return 0;373 374     case WM_QUERYENDSESSION:375     case WM_DESTROY:376 377         FileWrite (hwndEdit, TEXT ("TempStore.txt"));378         DeleteObject (hFont);379         DestroyMenu (hMenu);380         Shell_NotifyIcon (NIM_DELETE, &Notify);381         RegCloseKey (hKey);382 383         PostQuitMessage (0);384         return 0;385     }386     return DefWindowProc (hwnd, message, wParam, lParam);387 }388 389 LRESULT CALLBACK TempProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)390 {391     static BOOL iOnce = TRUE;392 393     if (message == WM_PAINT && iOnce)394     {395         SendMessage (GetParent (hwnd), WM_COMMAND, MAKELONG (ID_EDIT, EN_UPDATE), (LPARAM) hwnd);396         iOnce = FALSE;397     }398 399     return CallWindowProc (OldProc, hwnd, message, wParam, lParam);400 }


Func.cpp

  1  /*----------------------------------------  2    Note Pin on your screen.  3                 (c) 2014 LJN  4   ----------------------------------------*/  5   6 #include <windows.h>  7 #include <algorithm>  8 #include "notepin.h"  9 #include "resource.h" 10  11 BOOL FileWrite (HWND hwndEdit, PTSTR pstrFileName) //By Charles Petzold, 1998 12 { 13     DWORD    dwBytesWritten; 14     HANDLE    hFile; 15     int        iLength; 16     PTSTR    pstrBuffer; 17     WORD    wByteOrderMark = 0xFEFF; 18  19     if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= "color: #008080;"> 20         (hFile = CreateFile (pstrFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL))) 21     { 22         MessageBox (NULL, TEXT ("NO Access to Create the File!!!"), NULL, MB_ICONWARNING); 23         return FALSE; 24     } 25 #ifdef UNICODE 26     WriteFile (hFile, &wByteOrderMark, 2, &dwBytesWritten, NULL); 27 #endif 28     iLength = GetWindowTextLength (hwndEdit); 29     pstrBuffer = (PTSTR) malloc ((iLength + 1) * sizeof (TCHAR)); 30     GetWindowText (hwndEdit, pstrBuffer, iLength + 1); 31  32     if (!pstrBuffer) 33     { 34         MessageBox (NULL, TEXT ("Can NOT Create the Buffer!!!"), NULL, MB_ICONWARNING); 35         CloseHandle (hFile); 36         return FALSE; 37     } 38  39     WriteFile (hFile, pstrBuffer, iLength * sizeof (TCHAR), &dwBytesWritten, NULL); 40  41     if ((iLength * sizeof (TCHAR)) != (int) dwBytesWritten) 42     { 43         MessageBox (NULL, TEXT ("Too Many Characters!!!"), NULL, MB_ICONWARNING); 44         CloseHandle (hFile); 45         free (pstrBuffer); 46         return FALSE; 47     } 48  49     free (pstrBuffer); 50     CloseHandle (hFile); 51     return TRUE; 52 } 53  54 BOOL FileRead (HWND hwndEdit, PTSTR pstrFileName) //By Charles Petzold, 1998 55 { 56     BYTE    bySwap; 57     DWORD    dwBytesRead; 58     HANDLE    hFile; 59     int        i, iFileLength, iUniTest; 60     PBYTE    pBuffer, pText, pConv; 61  62         // Open the file. 63  64     if (INVALID_HANDLE_VALUE =http://www.mamicode.com/= "color: #008080;"> 65             (hFile = CreateFile (pstrFileName, GENERIC_READ, FILE_SHARE_READ, 66                             NULL, OPEN_EXISTING, 0, NULL))) 67         return FALSE; 68  69         // Get file size in bytes and allocate memory for read. 70         // Add an extra two bytes for zero termination. 71                  72     iFileLength = GetFileSize (hFile, NULL);  73     pBuffer = (BYTE *) malloc (iFileLength + 2); 74  75         // Read file and put terminating zeros at end. 76      77     ReadFile (hFile, pBuffer, iFileLength, &dwBytesRead, NULL); 78     CloseHandle (hFile); 79     pBuffer[iFileLength] = \0; 80     pBuffer[iFileLength + 1] = \0; 81  82         // Test to see if the text is Unicode 83  84     iUniTest = IS_TEXT_UNICODE_SIGNATURE | IS_TEXT_UNICODE_REVERSE_SIGNATURE; 85      86     if (IsTextUnicode (pBuffer, iFileLength, &iUniTest)) 87     { 88         pText = pBuffer + 2; 89         iFileLength -= 2; 90  91         if (iUniTest & IS_TEXT_UNICODE_REVERSE_SIGNATURE) 92         { 93             for (i = 0; i < iFileLength / 2; i++) 94             { 95                 bySwap = ((BYTE *) pText) [2 * i]; 96                 ((BYTE *) pText) [2 * i] = ((BYTE *) pText) [2 * i + 1]; 97                 ((BYTE *) pText) [2 * i + 1] = bySwap; 98             } 99         }100 101             // Allocate memory for possibly converted string102 103         pConv = (BYTE *) malloc (iFileLength + 2);104 105             // If the edit control is not Unicode, convert Unicode text to 106             // non-Unicode (ie, in general, wide character).107 108 #ifndef UNICODE109         WideCharToMultiByte (CP_ACP, 0, (PWSTR) pText, -1, pConv, 110                         iFileLength + 2, NULL, NULL);111 112             // If the edit control is Unicode, just copy the string113 #else114         lstrcpy ((PTSTR) pConv, (PTSTR) pText);115 #endif116 117     }118     else    // the file is not Unicode119     {120         pText = pBuffer;121 122             // Allocate memory for possibly converted string.123 124         pConv = (BYTE *) malloc (2 * iFileLength + 2);125 126             // If the edit control is Unicode, convert ASCII text.127 128 #ifdef UNICODE129         MultiByteToWideChar (CP_ACP, 0, (PSTR) pText, -1, (PTSTR) pConv, 130                         iFileLength + 1);131 132             // If not, just copy buffer133 #else134         lstrcpy ((PTSTR) pConv, (PTSTR) pText);135 #endif136     }137     138     SetWindowText (hwndEdit, (PTSTR) pConv);139     free (pBuffer);140     free (pConv);141    142     return TRUE;143 }144 145 BOOL TextStack::PushText (HWND hwndEdit)146 {147     int        iLength;148     PTSTR    pBuffer;149 150     iLength = GetWindowTextLength (hwndEdit);151     pBuffer = (PTSTR) malloc ((iLength + 1) * sizeof (TCHAR));152     GetWindowText (hwndEdit, pBuffer, iLength + 1);153 154     text.push (pBuffer);155 156     if (text.empty ())157         return FALSE;158     else159         return TRUE;160 }161 162 BOOL TextStack::PopText (HWND hwndEdit)163 {164     PTSTR pBuffer;165 166     if (text.size () > 1)167     {168         pBuffer = text.top ();169         free (pBuffer);170         text.pop ();171         pBuffer = text.top ();172         SetWindowText (hwndEdit, pBuffer);173         return TRUE;174     }175     else176         return FALSE;177 }178 179 TextStack::~TextStack ()180 {181     while (!text.empty ())182     {183         free (text.top ());184         text.pop ();185     }186 }

 

自high一下。。。

win32 便签