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.
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 :(
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.
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;
}