Update of /cvsroot/netrek/client/netrekxp/src In directory sc8-pr-cvs16:/tmp/cvs-serv25609/src Modified Files: mswindow.c Log Message: Rewrite of handling SDB initialization and update upon sizing window, contributed by ChronosWS. Index: mswindow.c =================================================================== RCS file: /cvsroot/netrek/client/netrekxp/src/mswindow.c,v retrieving revision 1.81 retrieving revision 1.82 diff -u -d -r1.81 -r1.82 --- mswindow.c 27 Apr 2007 07:15:28 -0000 1.81 +++ mswindow.c 27 Apr 2007 10:04:19 -0000 1.82 @@ -609,7 +609,10 @@ if (localSDB) { - SelectObject (localSDB->mem_dc, localSDB->old_bmp); + HBITMAP localObj; + + localObj = SelectObject (localSDB->mem_dc, localSDB->old_bmp); + DeleteObject (localObj); DeleteObject (localSDB->mem_bmp); ReleaseDC (((Window *)localSDB->window)->hwnd, localSDB->win_dc); DeleteDC (localSDB->mem_dc); @@ -618,7 +621,10 @@ if (mapSDB) { - SelectObject (mapSDB->mem_dc, mapSDB->old_bmp); + HBITMAP mapObj; + + mapObj = SelectObject (mapSDB->mem_dc, mapSDB->old_bmp); + DeleteObject (mapObj); DeleteObject (mapSDB->mem_bmp); ReleaseDC (((Window *)mapSDB->window)->hwnd, mapSDB->win_dc); DeleteDC (mapSDB->mem_dc); @@ -1865,25 +1871,11 @@ win->ClipRect.left = win->ClipRect.top = win->border; win->ClipRect.right = LOWORD (lParam) - win->border; win->ClipRect.bottom = HIWORD (lParam) - win->border; - // Reinitialize SDB as size/borders of window have changed + // Update SDB as size/borders of window have changed if ((Window *) w != NULL && win->hwnd == ((Window *) w)->hwnd && localSDB) - { - SelectObject (localSDB->mem_dc, localSDB->old_bmp); - DeleteObject (localSDB->mem_bmp); - ReleaseDC (((Window *)localSDB->window)->hwnd, localSDB->win_dc); - DeleteDC (localSDB->mem_dc); - free (localSDB); - localSDB = W_InitSDB (w); - } + W_UpdateSDB((W_Window) w, localSDB); else if ((Window *) mapw != NULL && win->hwnd == ((Window *) mapw)->hwnd && mapSDB) - { - SelectObject (mapSDB->mem_dc, mapSDB->old_bmp); - DeleteObject (mapSDB->mem_bmp); - ReleaseDC (((Window *)mapSDB->window)->hwnd, mapSDB->win_dc); - DeleteDC (mapSDB->mem_dc); - free (mapSDB); - mapSDB = W_InitSDB (mapw); - } + W_UpdateSDB((W_Window) mapw, mapSDB); break; case WM_SYSCOMMAND: @@ -5990,37 +5982,25 @@ } } -SDBUFFER * -W_InitSDB (W_Window window) +// +// Rebuilds the DCs for the SDBUFFER, either because of resize or on first creation. +// Returns 0 on failure, 1 on success. +// +int +W_RecreateSDBDCs(W_Window window, SDBUFFER* sdb) { - Window * win; - SDBUFFER * sdb; + Window * win = ((Window *)window); HBITMAP junk; - win = ((Window *)window); - - if (win->hwnd == NULL) - return NULL; - - if (strcmpi (win->name, "local") == 0) - win->sdb_flags = SDB_FLAG_LOCAL; - else if (strcmpi (win->name, "map") == 0) - win->sdb_flags = SDB_FLAG_MAP; - sdb = (SDBUFFER *) malloc (sizeof (SDBUFFER)); - sdb->window = (W_Window) malloc (sizeof (Window)); - - sdb->window = window; - - GetClientRect (win->hwnd, &(sdb->wr)); - sdb->win_dc = GetDC (win->hwnd); if (sdb->win_dc == NULL) - return NULL; + return 0; sdb->mem_dc = CreateCompatibleDC (sdb->win_dc); if (sdb->mem_dc == NULL) - return NULL; + return 0; + GetClientRect (win->hwnd, &(sdb->wr)); //This code ripped from W_Initialize, better safe than sorry junk = CreateBitmap (1, 1, 1, 1, NULL); GlobalOldMemDCBitmap = (HBITMAP) SelectObject (sdb->win_dc, junk); @@ -6028,15 +6008,59 @@ GlobalOldMemDC2Bitmap = (HBITMAP) SelectObject (sdb->mem_dc, junk); SelectObject (sdb->mem_dc, GlobalOldMemDC2Bitmap); DeleteObject (junk); - + sdb->mem_bmp = CreateCompatibleBitmap (sdb->win_dc, sdb->wr.right, sdb->wr.bottom); if (sdb->mem_bmp == NULL) - return NULL; + return 0; sdb->old_bmp = (HBITMAP) SelectObject (sdb->mem_dc, sdb->mem_bmp); FillRect (sdb->mem_dc, &sdb->wr, colortable[W_Black].brush); + return 1; +} + +// +// Deallocates and recreates the DCs associated with the SDBUFFER +// +void +W_UpdateSDB(W_Window window, SDBUFFER * sdb) +{ + Window * win = ((Window *)window); + HBITMAP origObj; + + origObj = SelectObject(sdb->mem_dc, sdb->old_bmp); + DeleteObject(sdb->mem_bmp); + DeleteObject(origObj); + ReleaseDC (((Window *)sdb->window)->hwnd, sdb->win_dc); + DeleteDC (sdb->mem_dc); + + (void) W_RecreateSDBDCs(window, sdb); +} + +SDBUFFER * +W_InitSDB (W_Window window) +{ + Window * win; + SDBUFFER * sdb; + + win = ((Window *)window); + + if (win->hwnd == NULL) + return NULL; + + if (strcmpi (win->name, "local") == 0) + win->sdb_flags = SDB_FLAG_LOCAL; + else if (strcmpi (win->name, "map") == 0) + win->sdb_flags = SDB_FLAG_MAP; + sdb = (SDBUFFER *) malloc (sizeof (SDBUFFER)); + sdb->window = (W_Window) malloc (sizeof (Window)); + + sdb->window = window; + + if (0 == W_RecreateSDBDCs(window, sdb)) + return NULL; + return sdb; }