15. juli 2004 - 16:36
Der er
9 kommentarer og 1 løsning
Hvorfor skrives uret oven i det gamle ur?
Jeg har lavet koden: case WM_TIMER: result = time(NULL); strftime(timeStamp,sizeof(timeStamp),"%H:%M:%S",localtime(&result)); xpos = GetSystemMetrics(SM_CXSCREEN); ypos = GetSystemMetrics(SM_CYSCREEN); hfOld = (HFONT)SelectObject(hDC, GetStockObject(DEFAULT_GUI_FONT)); SetBkColor(hDC, RGB(0,0,0)); SetTextColor(hDC, RGB(0,0,0)); SetBkMode(hDC, TRANSPARENT); txtrect.bottom = ypos-10; txtrect.top = ypos-100; txtrect.right = xpos-10; txtrect.left = xpos-100; DrawText(hDC, timeStamp, -1, &txtrect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); SelectObject(hDC, hfOld); break ; Hvordan får jeg denne kode til at skrive tiden ud, men ikke skrive oven i den gamle? På et eller anden måde skal jeg vel repainte baggrunden? Eller nulstille min rect?
Annonceindlæg fra Arctic Wolf
Du kan slette rect'en med FillRect(), først laver du en Brush med CreateSolidBrush
Ok, men kan jeg også bruge FillRect(), når nu jeg bruger: SetBkMode(hDC, TRANSPARENT); Jeg har brugt et BMP-billede som baggrund, det fylder 3,5mb. Det er nok lidt meget "trafik", hvis jeg skal repainte det mellem hver klokkeslæt. Eller hvad?
Du behøver ikke tegne hele BMP'en hver gang tu har skevet klokken, du kan nøjes med at opdatere den del hvor klokken står. Du bruger f.ex StretchBlt, efter at du har lavet en "memory DC" med CreateCompatibleDC, og valgt bitmappen ind i denne DC med SelectObject.
Det er måske mere optimalt at bruge BitBlt isf. StretchBlt.
Ok, vil kigge på det i morgen! Er ikke så skrap til det der SDK kodning endnu! :o/ Men man skal jo starte et sted! Du får lige den kode jeg bruger til at painte mit baggrundsbillede med: case WM_PAINT: { hDc = BeginPaint(hWnd, &ps); HDC hdcMem = CreateCompatibleDC(hDc); HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, g_hbmBack); GetObject(g_hbmBack, sizeof(bm), &bm); BitBlt(hDc, 47, 10, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY); SelectObject(hdcMem, hbmOld); DeleteDC(hdcMem); EndPaint(hWnd, &ps); } break; Kan du evt med noget kode, redigere, så det kommer til at gøre det jeg ønsker? Ellers kigger jeg på det i morgen som sagt, og så kan jeg spørge videre derfra! :o) Jeg skal jo også gå og gruble lidt!
#include <windows.h> #include <windowsx.h> #include <commctrl.h> #include <string.h> #include "ng53res.h" #include <time.h> HINSTANCE hInst; HWND hwndMain; HBITMAP BitmapHandle; BITMAP Bitmap; LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); break; case WM_TIMER: { time_t now; RECT R; HDC dc = GetDC(hwnd); HDC MemDC = CreateCompatibleDC(dc); HBITMAP OldBitmap = (HBITMAP )SelectObject(MemDC, (HGDIOBJ )BitmapHandle); R.left = 10; R.top = 10; R.right = 200; R.bottom = 20; BitBlt(dc, 10, 10, 190, 10, MemDC, 10, 10, SRCCOPY); SetBkMode(dc, TRANSPARENT); SetTextColor(dc, RGB(255, 0, 0)); time(&now); DrawText(dc, ctime(&now), -1, &R, DT_SINGLELINE | DT_CENTER | DT_VCENTER); SelectObject(MemDC, OldBitmap); DeleteObject(MemDC); ReleaseDC(hwnd, dc); break; } case WM_PAINT: { PAINTSTRUCT PaintStruct; HDC dc = BeginPaint(hwnd, &PaintStruct); HDC MemDC = CreateCompatibleDC(dc); HBITMAP OldBitmap = (HBITMAP )SelectObject(MemDC, (HGDIOBJ )BitmapHandle); BitBlt(dc, 0, 0, Bitmap.bmWidth, Bitmap.bmHeight, MemDC, 0, 0, SRCCOPY); SelectObject(MemDC, OldBitmap); DeleteObject(MemDC); EndPaint(hwnd, &PaintStruct); break; } default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } HWND CreateWnd(void) { WNDCLASS wc; memset(&wc,0,sizeof(WNDCLASS)); wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ; wc.lpfnWndProc = (WNDPROC)MainWndProc; wc.hInstance = hInst; wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszClassName = "NG53WndClass"; wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); if (!RegisterClass(&wc)) return 0; return CreateWindow("NG53WndClass","NG53", WS_MINIMIZEBOX | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_MAXIMIZEBOX | WS_CAPTION | WS_BORDER | WS_SYSMENU| WS_THICKFRAME, 10, 10, Bitmap.bmWidth + 2*GetSystemMetrics(SM_CXBORDER), Bitmap.bmHeight + GetSystemMetrics(SM_CYCAPTION) + 2*GetSystemMetrics(SM_CYBORDER), NULL, NULL, hInst, NULL); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow) { MSG msg; BitmapHandle = (HBITMAP )LoadImage(0, "sample.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); if(!BitmapHandle) { MessageBox(0, "Failed to load bitmap", "NG53", MB_OK); return 0; } GetObject(BitmapHandle, sizeof(Bitmap), &Bitmap); hInst = hInstance; if((hwndMain = CreateWnd()) == (HWND )0) return 0; ShowWindow(hwndMain, SW_SHOW); SetTimer(hwndMain, 1000, 1000, 0); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }
Perfekt! Og du vil vel ikke smide et svar og ahve point? (hvis altså jeg husker rigtigt) En anden ting, teksten som skrives, skulle meget gerne være samme højde/type som uret i nederste højre hjørne, kan det fikses? Ja, men hvordan?
Du skal sætte en font på DC'en inden du udskriver. Først laver du en font med f.ex. CreateFont eller CreateFontIndirect. Der er mange paramtre, men du kan måske nøjes med at sætte højden og "face" og sætte resten til 0. Derpå vælger du fonten ind i DC'en med SelectObject. Du kan muligvis bruge en af fontene man kan få med GetStockObject, f.ex. ANSI_VAR_FONT eller SYSTEM_FONT. Jeg laver stadig ikke svar.
16. juli 2004 - 17:47
#10
Ok, men jeg takker ihf for dine ihærdige svar! :o)
Kurser inden for grundlæggende programmering