 |
|
 |
Great job, it looks great! I was just wondering, how would I go about drawing shapes such as rectangles, ellipses and lines using GDI? I've tried creating a Graphics object with the Graphics.FromHdc method but when I try drawing something, it doesn't appear.
|
|
|
|
 |
|
 |
Never mind, I created a new bitmap and just drew onto it using Graphics.FromImage.
|
|
|
|
 |
|
 |
Hi, I wanted to use this code inside an MDI Container to darken the area around an dialog box (like Vista/7 does), but I can't really figure out how to do it.
When I try to make the image bigger than it's 'physical' size is, it just isn't displayed. Do you know how to solve this prob? I haven't found a solution so far.
|
|
|
|
 |
|
 |
Is there a way to display a tooltip for a control on the form?
the controls are displayed with your code:
Bitmap temp_bmp = new Bitmap(bitmap);
foreach (Control ctrl in this.Controls)
{
ctrl.DrawToBitmap(temp_bmp, ctrl.Bounds);
}
|
|
|
|
 |
|
 |
Can you give use link of whole project with *.csproj or sln files,, b`coz it is difficult to create and load any form single file in VS 2005
|
|
|
|
 |
|
|
 |
|
|
 |
|
 |
Used your code in my project, works flawless
Thank you!
|
|
|
|
 |
|
 |
I made an image in the GIMP and saved it as a transparent png but it isn't working?
I'm getting the "The bitmap must be 32ppp with alpha-channel." exception. How do I check to this? I've never hear of "ppp" before.
-Elmernite
After editing around I found that I need to set "Save color values from transparent pixels" With that checked it works.
modified on Thursday, December 17, 2009 11:37 AM
|
|
|
|
 |
|
 |
| I think the author mis-typed bpp (Bits-Per-Pixel)... Gee
|
|
|
|
 |
|
 |
I noticed that anchoring doesnt work if you use PPAB,
I think its because of the way controls are drawn to bitmap, anchor offsets are not taken into account, Can you help me fix this ?
|
|
|
|
 |
|
 |
Is it possible to draw on that image ? say a rectangle ?
What is the way to access the pixel buffer and modify it ? rgba-wise
Would it take a double buffer for the drawing to avoid the flickering ?
tx
|
|
|
|
 |
|
 |
Here is a workaround:
...
class PerPixelAlphaForm : Form
{
<code>Timer _RefreshFormTimer = new Timer();</code>
public AlphaForm()
{
// This form should not have a border or else Windows will clip it.
FormBorderStyle = FormBorderStyle.None;
<code>_RefreshFormTimer.Interval = 10;
_RefreshFormTimer.Tick += new EventHandler(RefreshFormTimer_Tick);
_RefreshFormTimer.Enabled = true;</code>
}
<code>private Bitmap _FormBitmap;
private byte _FormOpacity;
private void RefreshFormTimer_Tick(object sender, EventArgs e)
{
if (_FormBitmap != null)
SetBitmap(_FormBitmap, _FormOpacity);
}</code>
/// <para>Changes the current bitmap.</para>
public void SetBitmap(Bitmap bitmap)
{
SetBitmap(bitmap, 255);
}
...
...
Gottdrak99
modified on Thursday, November 27, 2008 3:22 AM
|
|
|
|
 |
|
 |
fantastic! exactly what i was looking for...
Small note: I also had to wrap a .Visible check around the .DrawToBitmap method to meet my requirements.
foreach (Control ctrl in this.Controls) {
if (ctrl.Visible) {
ctrl.DrawToBitmap(bitmap, ctrl.Bounds);
}
}
|
|
|
|
 |
|
 |
With this solution (timer) how can you show a blinking caret in a textbox?
|
|
|
|
 |
|
 |
Great addition!
One could also add in front of _FormBitmap = bitmap; to do that only if _FormBitmap is null.
Thatway, if you change for example Text on Label with transparent background, it won't be mixed.
|
|
|
|
 |
|
|
 |
|
 |
Hi,
I'm looking for a function simular as this code.
But I don't need a transparent form - I just need a transparent control inside a form.
Maybe somebody can help.
Thanks,
Andre
|
|
|
|
 |
|
 |
good idea would be extend form class and put there Your implementation. It inherits Control internally, so there will be no problem.
|
|
|
|
 |
|
 |
just great!
peace & serenity
|
|
|
|
 |
|
 |
why using old win32 with .net and c#...? get rid of those old gdi handles...
|
|
|
|
 |
|
 |
because you cant update a layered window using a gdi+ bitmap....
|
|
|
|
 |
|
 |
How would I get this working with VB.Net 2005?
|
|
|
|
 |
|
 |
Class:
Imports System
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.Windows.Forms
Imports System.Runtime.InteropServices
'Translation from C# by Dj Den4ik
Public Class PerPixelAlphaForm
'Implements Windows.Forms.IWin32Window
Public Structure ARGB
Public Blue As Byte
Public Green As Byte
Public Red As Byte
Public Alpha As Byte
End Structure
Public Structure BLENDFUNCTION
Public BlendOp As Byte
Public BlendFlags As Byte
Public SourceConstantAlpha As Byte
Public AlphaFormat As Byte
End Structure
Public Const ULW_COLORKEY As Int32 = &H1
Public Const ULW_ALPHA As Int32 = &H2
Public Const ULW_OPAQUE As Int32 = &H4
Public Const AC_SRC_OVER As Byte = &H0
Public Const AC_SRC_ALPHA As Byte = &H1
Public Declare Function UpdateLayeredWindow Lib "user32" Alias "UpdateLayeredWindow" (ByVal hwnd As IntPtr, ByVal hdcDst As IntPtr, ByRef pptDst As Point, ByRef psize As Size, ByVal hdcSrc As IntPtr, ByRef pprSrc As Point, ByVal crKey As Int32, ByRef pblend As BLENDFUNCTION, ByVal dwFlags As Int32) As Boolean
Public Declare Function GetDC Lib "user32" Alias "GetDC" (ByVal hWnd As IntPtr) As IntPtr
Public Declare Function ReleaseDC Lib "user32" Alias "ReleaseDC" (ByVal hWnd As IntPtr, ByVal hDC As IntPtr) As Integer
Public Declare Function CreateCompatibleDC Lib "gdi32.dll" Alias "CreateCompatibleDC" (ByVal hDC As IntPtr) As IntPtr
Public Declare Function DeleteDC Lib "gdi32.dll" Alias "DeleteDC" (ByVal hDC As IntPtr) As Boolean
Public Declare Function SelectObject Lib "gdi32.dll" Alias "SelectObject" (ByVal hDC As IntPtr, ByVal hObject As IntPtr) As IntPtr
Public Declare Function DeleteObject Lib "gdi32.dll" Alias "DeleteObject" (ByVal hObject As IntPtr) As Boolean
Public Sub SetBitmap(ByVal bitmap As Bitmap, ByVal opacity As Byte, ByVal frm As Form)
If bitmap.PixelFormat <> PixelFormat.Format32bppArgb Then Throw New ApplicationException("The bitmap must be 32ppp with alpha-channel.")
' The ideia of this is very simple,
' 1. Create a compatible DC with screen;
' 2. Select the bitmap with 32bpp with alpha-channel in the compatible DC;
' 3. Call the UpdateLayeredWindow.
Dim screenDc As IntPtr = GetDC(IntPtr.Zero)
Dim memDc As IntPtr = CreateCompatibleDC(screenDc)
Dim hBitmap As IntPtr = IntPtr.Zero
Dim oldBitmap As IntPtr = IntPtr.Zero
Try
hBitmap = bitmap.GetHbitmap(Color.FromArgb(0)) ' grab a GDI handle from this GDI+ bitmap
oldBitmap = SelectObject(memDc, hBitmap)
Dim size As New Size(bitmap.Width, bitmap.Height)
Dim pointSource As New Point(0, 0)
Dim topPos As New Point(frm.Left, frm.Top)
Dim blend As New BLENDFUNCTION
blend.BlendOp = AC_SRC_OVER
blend.BlendFlags = 0
blend.SourceConstantAlpha = opacity
blend.AlphaFormat = AC_SRC_ALPHA
UpdateLayeredWindow(frm.Handle, screenDc, topPos, size, memDc, pointSource, 0, blend, ULW_ALPHA)
Finally
ReleaseDC(IntPtr.Zero, screenDc)
If hBitmap <> IntPtr.Zero Then
SelectObject(memDc, oldBitmap)
DeleteObject(hBitmap)
End If
DeleteDC(memDc)
End Try
End Sub
Form:
Dim ppaf As New PerPixelAlphaForm
Dim bmp As New Bitmap("D:\Audio\FL Studio 7\Artwork\FL Studio Producer Edition\Title_.png")
Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
Get
Dim SecPerm As New Security.Permissions.SecurityPermission(Security.Permissions.PermissionState.Unrestricted)
SecPerm.Demand()
' Extend the CreateParams property of the Button class.
Dim cp As System.Windows.Forms.CreateParams = MyBase.CreateParams
' Update the button Style.
cp.ExStyle = &H80000
Return cp
End Get
End Property
Private Sub frmTest_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
Me.TopMost = True
For Each ctrl As Control In Me.Controls
ctrl.DrawToBitmap(bmp, ctrl.Bounds)
Next
Me.Region = New Region()
ppaf.SetBitmap(bmp, 240, Me)
End Sub
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Const WM_MOUSEMOVE As Int32 = &H200
Const WM_NCLBUTTONDOWN As Int32 = &HA1
Const HTCAPTION As Int32 = 2
'// ????????????? WM_MOUSEMOVE
If m.Msg = WM_MOUSEMOVE Then
'// ???????? ReleaseCapture
MyBase.Capture = False
'// ??????? ???? ?????????
Dim message As New Message
With message
.HWnd = Me.Handle
.Msg = WM_NCLBUTTONDOWN
.WParam = HTCAPTION
.LParam = 0&
End With
'// ?????????? ???? ????????? ????
MyBase.WndProc(message)
End If
MyBase.WndProc(m)
End Sub
|
|
|
|
 |
|
 |
Simply the BEST!! Many thanks, Rui!!!
|
|
|
|
 |