如何在c#中将位图的IntPtr传递给CreateCaret?

时间:2016-03-31 23:49:23

标签: c# bitmap caret

我有以下代码

Bitmap Bmp=new Bitmap( nWidth, nHeight );
using ( Graphics gfx=Graphics.FromImage( Bmp ) ) {
    using ( SolidBrush brush=new SolidBrush( ForeColor ) ) {
        gfx.FillRectangle( brush, 0, 0, nWidth, nHeight );
    }
    Bmp = new Bitmap(nWidth, nHeight, gfx);
    CreateCaret( base.Handle, Bmp, nWidth, nHeight );
}

ShowCaret( base.Handle );

我遇到的问题是:

CreateCaret( base.Handle, Bmp, nWidth, nHeight );

...因为它期望Bmp成为IntPtr

这个概念我试图以一种不需要从文件或资源加载位图的方式来实现这一点,而是在运行中创建更多位图。我知道我可以通过IntPtr.Zero并且它会创造一个克拉但是如果我这样做的话颜色就会消失。

如何将创建的位图传递给CreateCaret方法?

1 个答案:

答案 0 :(得分:0)

传递位图的最简单方法是抓取位图的句柄。 Microsoft已向GetHbitmap()类型提供Bitmap扩展名。

这可以按如下方式完成:

Bitmap bmp = new Bitmap( 800, 600 );  // create a new bitmap 800x600
IntPtr ptr = bmp.GetHbitmap(); // get the IntPtr handle

使用我的问题中的上述示例,可以如下处理Caret创建:

CreateCaret( base.Handle,  bmp.GetHbitMap(),  hWidth,  hHeight );

结果如下:

// Set the Caret color
Color CaretColor = Color.White;

// Invert the Caret color (ineffective)
Color invertedCaretColor=Color.FromArgb( CaretColor.ToArgb()^0xffffff );

// Get the character size
int nHeight = Convert.ToInt32(gfx.MeasureString("Z", base.Font).Height); // set the height to full character height
int nWidth = Convert.ToInt32(gfx.MeasureString("Z", base.Font).Width); // set the width to full character width

if ( nWidth>0&&nHeight>0 ) {
    // initialize bitmap
    using ( Bitmap bmp=new Bitmap( nWidth, nHeight ) ) {

        // initialize graphics
        using ( Graphics gfx=Graphics.FromImage( bmp ) ) {
            nWidth = Convert.ToInt32(gfx.MeasureString("Z", base.Font).Width * .66); // set the width to 2/3 character width

            // initialize brush for drawing background
            using ( SolidBrush brush=new SolidBrush( invertedCaretColor ) ) {
                gfx.FillRectangle( brush, 1, 1, nWidth, nHeight ); // draw offset by 1 pixel

                // initialize final bitmap for output as Caret
                using ( Bitmap bmp2=new Bitmap( nWidth, nHeight, gfx ) ) {

                    // Draw the Caret;

                    CreateCaret( base.Handle, bmp2.GetHbitmap(), nWidth, nHeight );
                    ShowCaret( base.Handle );
                }
            }
        }
    }
}

注意 插入颜色总是基于背景颜色计算。这可以修改,但这里的文档只是概括了一个可能的概念:How To Control the Caret Color

该文件对此概念有这样的说法:

  

要将插入符号颜色更改为黑色或白色以外的其他颜色需要更多的工作,结果可靠得多,因为应用程序必须解决以下等式:

 NOT(caret XOR background) = desired_color on the
                             "blink" of the caret.