初学可能描述不太清楚,主要是想做一个类似QQ主面板的窗体。于是重写了WndProc方法以实现自定义窗体,先做了HitTest()方法使得窗口可以自由拖动及改变大小。由于消掉了标题栏得自己做,同理修改WM_NCPAINT及WM_NCACTIVEATE
两个系统消息后将WindowDC转换为Graphics使用Framwork提供的绘图功能画出了最大化、最小化、关闭三个按钮。问题来
了,做到这里启动窗体后看不到按钮存在。双击窗体最大化后才会出现,没有设置过背景图片,背景色默认。按钮的代码
段放进来了求高手解决。 
[align=left]protected override void WndProc(ref Message m)
        {
            //标题栏按钮的消息判定
            switch (m.Msg)
            {
                case 0x0086://WM_NCACTIVEATE
                    goto case 0x0085;
                case 0x0085://WM_NCPAINT
                    {
                        IntPtr hdc = GetWindowDC(m.HWnd);
                        //将WindowDC转换为.net的graphics以便使用framework所提供的绘图功能
                        Graphics gs = Graphics.FromHdc(hdc);
                        gs.FillRectangle(new LinearGradientBrush(m_rect, Color.Pink, Color.Purple,//画按钮
                            LinearGradientMode.BackwardDiagonal), m_rect);                        StringFormat strfmt = new StringFormat();                        strfmt.Alignment = StringAlignment.Center;
                        strfmt.LineAlignment = StringAlignment.Center;                        gs.DrawString("X", this.parent.Font, Brushes.Black, m_rect, strfmt);//关闭按钮文本及颜色设置
                        gs.Dispose();
                        ReleaseDC(m.HWnd, hdc);
                        break;
                    }
                case 0x00a1:
                    Point mousepoint = new Point((int)m.LParam);
                    mousepoint.Offset(-this.parent.Left, -this.parent.Top);
                    if (m_rect.Contains(mousepoint))
                    {
                        this.parent.Close();
                    }
                    break;
            }            //点击测试的消息判定
            if (m.Msg == 0x0084)
            {
                m.Result = (IntPtr)HitTest();
                return;
            }            base.WndProc(ref m);
        }