Avatar billede quiw Nybegynder
16. april 2006 - 16:53 Der er 14 kommentarer og
1 løsning

Transparent Konsol.

Hejsa eksperter, jeg hr kigget omkring rimelig længe lige nu .. Og er ved at forsøge mig med at lave et konsol vindue som er transparrent, men uden held.. Kunne godt tænke mig en referance kode .. Hvis nogle kunne give mig et super kort eksempel som bare skal kompileres .. Som udføre disse funktioner:
- Transparrent console vindue
- Eventuelt mulighed for at bruge et jpg billede som skin .. F.eks. som http://www.linuks.mine.nu/screenshots/noonie.jpg

- Har lagt flere point i, da jeg egentlig skal bruge en fuld kode .. Og det ville være rart hvis man kunne gøre sådan, at det jpg billede man bruger bliver gemt i exe filen, sådan at man til sidst kun har 1 fil.

- Skriv endelig hvis der skal flere point til?, på forhånd tak.
Avatar billede quiw Nybegynder
16. april 2006 - 16:54 #1
By the way, det er windows vi snakker om :)
- Screenshottet er godt nok fra linux, men det skulle bare illustere mit formål.
Avatar billede bertelbrander Novice
16. april 2006 - 20:13 #2
Jeg er bange for at det bliver svært :-(

Man kan god lave "normale" vinduer transperante, men et konsol vindue er ikke et normalt vindue. At sætte et billede som baggrund for en konsol vindue har jeg ingen idé om hvordan man gør, eller om det er muligt.

Jeg tror at det letteste er at emulere det med et "almindelig" vindue, evt en edit box.
Avatar billede quiw Nybegynder
16. april 2006 - 20:27 #3
Jeg har faktisk rodet lidt med noget du havde på din hjemmeside.. Og kom frem til et udmærket resultat.. Jeg er ikke desideret interesseret i et konsol vindue, det skal bare være et vindue som jeg kan skrive til, med tekst .. Som f.eks. konsol .. Det behøver ikke være desideret windows cmd.. Jeg brugte din guide "Funny windows" og lavede et "Skin" og ved at gøre "hver anden pixel" gennesigtig, opnåede jeg et transparent vindue, men problemet er bare hvis man klikker på en af de pixels, hopper man jo ud af vinduet :(
Avatar billede quiw Nybegynder
16. april 2006 - 20:28 #4
.. Men hvis nu man brugte gif, kunne man så ikke gøre det transparrent som billede?
Avatar billede bertelbrander Novice
16. april 2006 - 20:42 #5
Er det kun programmet selv der skal skrive til vinduet?
Skal du kunne læse fra keyboard i vinduet?
Jeg kan godt prøve at lave et eksempel, måske senere på aftenen.
Avatar billede quiw Nybegynder
16. april 2006 - 20:43 #6
Altså.. Det skal kunne læse fra keyboard .. Altså opfører sig som f.eks. CMD ..
Avatar billede hippien Nybegynder
16. april 2006 - 21:22 #7
Hvis du får fat i window hwnd på din cmd burde den kunne gøres transparent ligesom alle vinduer i windows kan gøres - og jeg siger RIGTIG transparent, ikke som i x-windows som er pseudo-transparent kun!

Jeg har arbejdet med det i visual basic i sin tid, prøv at søge på transparancy på planetsourcecode i vb-sektionen, der er en masse du kan bruge, ihvertfald windows-api-navnene kan du tage og bruge, og det er jo de samme parametre du skal bruge selvom du skriver i et andet sprog !

Jeg kan desværre ikke give dig noget eksempel, men jeg håber det her kan hjælpe dig på vej.

Jeg ved ikke helt hvordan du laver med skins.
Avatar billede bertelbrander Novice
16. april 2006 - 21:50 #8
Jeg har prøvet at lave en cmd vindue transparent, det virker ikke.
Men kan du vise hvordan man gør i Basic ville det være en stor hjælp.
Avatar billede quiw Nybegynder
16. april 2006 - 22:26 #9
Nu kommer million spørgsmålet.. Kan man bare bruge VB koden i C++ ?.. :S bruger devc++
Avatar billede bertelbrander Novice
16. april 2006 - 23:14 #10
Man kan ikke bruge VB koden direkte i C++, men man kan måske "oversætte" fra VB til C++.
Avatar billede bertelbrander Novice
17. april 2006 - 00:54 #11
Jeg har lavet nedenstående, det burde kunne bruges som en start.
Det kan endnu ikke læse fra tastatur, og der er ikke nogen cursor.
Men det er hvad jeg når i aften. Prøv at kikke på det og se om det virker som du forventer.

Programmet forventer at finde et billede kaldet baggrund.bmp, som det vil bruge som baggrund. Billedet forventes at være ImageWidth*ImageHeight stort. Senere kan vi godt lave det som en del af programmet, det letteste er at det er et .bmp billede.

#define _WIN32_WINNT 0x0500

#include <windows.h>
#include <stdio.h>
#include <list>
#include <string>
#include <sstream>

const int ImageWidth = 725;
const int ImageHeight = 447;
int Counter;

HWND WindowHandle;
HBITMAP BackBitmap = (HBITMAP )LoadImage(0, "baggrund.bmp", IMAGE_BITMAP, ImageWidth, ImageHeight, LR_LOADFROMFILE);
std::list<std::string > TextLines;

void Draw(HDC aDc)
{
  HDC MemDC = CreateCompatibleDC(aDc);
  HBITMAP OldBitmap = (HBITMAP )SelectObject(MemDC, BackBitmap);
  BitBlt(aDc, 0, 0, ImageWidth, ImageHeight, MemDC, 0, 0, SRCCOPY);
  SelectObject(MemDC, OldBitmap);

  TEXTMETRIC TextMetric;
  GetTextMetrics(aDc, &TextMetric);
  int CharH = TextMetric.tmHeight > 0 ? TextMetric.tmHeight : -TextMetric.tmHeight;
  SetBkMode(aDc, TRANSPARENT);
  std::list<std::string >::const_iterator it;
  int i;
  for(it = TextLines.begin(), i = 0; it != TextLines.end(); i++, ++it)
      TextOut(aDc, 0, i*CharH, it->c_str(), it->size());

  DeleteObject(MemDC);
}

void AddTextLine(const std::string& aStr)
{
  HDC dc = GetDC(WindowHandle);
  TEXTMETRIC TextMetric;
  GetTextMetrics(dc, &TextMetric);
  int CharH = TextMetric.tmHeight > 0 ? TextMetric.tmHeight : -TextMetric.tmHeight;
  int NumLines = ImageHeight/CharH;

  if(int(TextLines.size() + 1) > NumLines)
      TextLines.pop_front();
  TextLines.push_back(aStr);
  Draw(dc);
  ReleaseDC(WindowHandle, dc);
}

LRESULT CALLBACK DialogProc(HWND aWnd, UINT aMsg, WPARAM wParam, LPARAM lParam)
{
  switch(aMsg)
  {
  case WM_CREATE:
      {
        const LONG Style = WS_EX_LAYERED;
        LONG OldState = GetWindowLong(aWnd, GWL_EXSTYLE);
        LONG NewState = OldState | Style;
        SetWindowLong(aWnd, GWL_EXSTYLE, NewState);
        SetLayeredWindowAttributes(aWnd, 0, 160, LWA_ALPHA);
        SetTimer(aWnd, 1000, 1000, 0);
      }
      break;
  case WM_TIMER:
      {
        std::stringstream SS;
        SS << "Counter: ";
        SS << Counter++;
        AddTextLine(SS.str());
      }
      break;
  case WM_PAINT:
      {
        PAINTSTRUCT PaintStruct;
        HDC dc = BeginPaint(aWnd, &PaintStruct);
        Draw(dc);
        EndPaint(aWnd, &PaintStruct);
      }
      break;
  case WM_SIZE:
      return 0;
  case WM_COMMAND:
      break;
  }
  return DefWindowProc(aWnd, aMsg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, INT)
{
  WNDCLASS wc;
  memset(&wc, 0, sizeof(WNDCLASS));
  wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  wc.lpfnWndProc = DialogProc;
  wc.hInstance = hInstance;
  wc.hbrBackground = (HBRUSH )(COLOR_BTNFACE + 1);
  wc.lpszClassName = "WhateverClass";
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  if(!RegisterClass(&wc))
      return FALSE;

  int Width = ImageWidth + 2*GetSystemMetrics(SM_CXBORDER);
  int Height = ImageHeight + 2*GetSystemMetrics(SM_CYBORDER) + GetSystemMetrics(SM_CYCAPTION);

  WindowHandle = CreateWindow("WhateverClass",
                              "Whatever",
                              WS_VISIBLE | WS_CLIPSIBLINGS |
                              WS_CLIPCHILDREN | WS_CAPTION | WS_BORDER | WS_SYSMENU,
                              100, 100, Width, Height,
                              NULL,
                              NULL,
                              hInstance,
                              0);
  MSG Msg;
  while(GetMessage(&Msg, WindowHandle, 0, 0xFFFF) > 0)
  {
      if(!IsDialogMessage(WindowHandle, &Msg))
      {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
      }
  }
  return 0;
}
Avatar billede quiw Nybegynder
17. april 2006 - 01:39 #12
Det kan betydentligvis godt bruges ! .. Prøver at rodde lidt med det hen af aftenen og se hvad det bliver til .. Mange tak..
Avatar billede quiw Nybegynder
21. april 2006 - 13:05 #13
Kunne faktisk godt bruge det :)
- Kan du lige smide et svar?
Avatar billede bertelbrander Novice
21. april 2006 - 13:19 #14
Jeg samler ikke på point.
Avatar billede quiw Nybegynder
24. april 2006 - 09:33 #15
Må smide et svar selv så .. Mange tak for hjælpen!..
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