Avatar billede jakobdo Ekspert
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?
Avatar billede bertelbrander Novice
15. juli 2004 - 16:41 #1
Du kan slette rect'en med FillRect(), først laver du en Brush med CreateSolidBrush
Avatar billede jakobdo Ekspert
15. juli 2004 - 20:00 #3
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?
Avatar billede bertelbrander Novice
15. juli 2004 - 20:30 #4
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.
Avatar billede bertelbrander Novice
15. juli 2004 - 20:49 #5
Det er måske mere optimalt at bruge BitBlt isf. StretchBlt.
Avatar billede jakobdo Ekspert
15. juli 2004 - 21:19 #6
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!
Avatar billede bertelbrander Novice
15. juli 2004 - 23:44 #7
#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;
}
Avatar billede jakobdo Ekspert
16. juli 2004 - 14:04 #8
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?
Avatar billede bertelbrander Novice
16. juli 2004 - 16:51 #9
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.
Avatar billede jakobdo Ekspert
16. juli 2004 - 17:47 #10
Ok, men jeg takker ihf for dine ihærdige svar! :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester