c#如何重绘窗口

WUSUSU 2007-10-20 09:54:52
c#如何重绘窗口
...全文
6810 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
elloop 2012-05-22
  • 打赏
  • 举报
回复
激情路过,友情帮顶
mingcsharp 2011-09-02
  • 打赏
  • 举报
回复
case WM_NCHITTEST:
Point vPoint = new Point((int)m.LParam & 0xFFFF,
(int)m.LParam >> 16 & 0xFFFF);
vPoint = PointToClient(vPoint);
if (vPoint.X <= 5)
if (vPoint.Y <= 5)
m.Result = (IntPtr)HTTOPLEFT;
else if (vPoint.Y >= ClientSize.Height - 5)
m.Result = (IntPtr)HTBOTTOMLEFT;
else m.Result = (IntPtr)HTLEFT;
else if (vPoint.X >= ClientSize.Width - 5)
if (vPoint.Y <= 5)
m.Result = (IntPtr)HTTOPRIGHT;
else if (vPoint.Y >= ClientSize.Height - 5)
m.Result = (IntPtr)HTBOTTOMRIGHT;
else m.Result = (IntPtr)HTRIGHT;
else if (vPoint.Y <= 5)
m.Result = (IntPtr)HTTOP;
else if (vPoint.Y >= ClientSize.Height - 5)
m.Result = (IntPtr)HTBOTTOM;
break;

zswang
想请教一下这段代码是什么意思?
能不能详细的解释一下,谢谢!
xqqkl 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 zswang 的回复:]
哥们我也有自己的工作要做,目前还没找到不干事就发工资的老板
[/Quote]

学了不少。恰好我这会儿也要重做重绘窗口的事
jing51536 2010-12-03
  • 打赏
  • 举报
回复
C#中重载WndProc的前提条件是什么,
就是说,要用到的库名,用到的包名。

当我是直接从System.Object 继承的时候,
编译器会提示base.WndProc,System.Object中无WndProc方法法。

请问高手怎样解决。
谢谢。
yhl443541815 2010-08-24
  • 打赏
  • 举报
回复
求教,怎么样能在没有边界的绘图控件上,可以向下滚动啊
stszd604 2010-02-16
  • 打赏
  • 举报
回复
挖塞 好东西呀~~~~~~~~~~
王集鹄 2007-10-24
  • 打赏
  • 举报
回复
哥们我也有自己的工作要做,目前还没找到不干事就发工资的老板

CheckDlgButton(vhand, button1, ?????);
不是第三个参数出问题而是第二个,button1是Button类型,和int nlDButton不匹配

你的目的是什么要说清楚,相关的函数调用可以到网上搜索到例子,如果搜都不会就太....
这帖是最后回一次,我有点顶不住了,问问别人吧。
WUSUSU 2007-10-24
  • 打赏
  • 举报
回复
[DllImport("user32.dll")]
private static extern IntPtr FindWindow(string IpClassName, string IpWindowName);
[DllImport("user32.dll")]
private static extern int MessageBox(int h, string m, string c, int type
[DllImport("user32.dll")]
private static extern bool CheckDlgButton(IntPtr HWNDhDlg, int nlDButton,System.UInt32 uCheck);
private void button2_Click(object sender, EventArgs e)
{
IntPtr vhand = FindWindow(null, "Form1");
bool a = CheckDlgButton(vhand, button1, ?????);
MessageBox(0,a.ToString(), "内容", 0);
}
那个问号的位置看上面那个接口的参数类型是UINT,我在下面输入BST_UNCHECKED不行,输入一个整数也报错,这个在C#中该如何解决呢?
zswang,谢谢你,能够把你的QQ号码给我,有什么问题我可以直接问你。
王集鹄 2007-10-24
  • 打赏
  • 举报
回复
API函数在MSDN里也可以找到,在网上搜索关键字"API 函数 CHM"
控件的句柄通过Control.Handle属性得到
王集鹄 2007-10-23
  • 打赏
  • 举报
回复
最好在网上先找一下,“C# 皮肤控件”有例子照着做就简单多了
王集鹄 2007-10-23
  • 打赏
  • 举报
回复
大概明白了,你是想自己改变标题的风格不单是在标题栏上绘制东西
这样我建议先将窗体设置为无边框的窗体(也没有标题栏)然后在上面自己模拟一个标题栏

如下是无边框的窗体拖动大小的代码供参考
const int WM_NCHITTEST = 0x0084;
const int HTLEFT = 10;
const int HTRIGHT = 11;
const int HTTOP = 12;
const int HTTOPLEFT = 13;
const int HTTOPRIGHT = 14;
const int HTBOTTOM = 15;
const int HTBOTTOMLEFT = 0x10;
const int HTBOTTOMRIGHT = 17;

protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg)
{
case WM_NCHITTEST:
Point vPoint = new Point((int)m.LParam & 0xFFFF,
(int)m.LParam >> 16 & 0xFFFF);
vPoint = PointToClient(vPoint);
if (vPoint.X <= 5)
if (vPoint.Y <= 5)
m.Result = (IntPtr)HTTOPLEFT;
else if (vPoint.Y >= ClientSize.Height - 5)
m.Result = (IntPtr)HTBOTTOMLEFT;
else m.Result = (IntPtr)HTLEFT;
else if (vPoint.X >= ClientSize.Width - 5)
if (vPoint.Y <= 5)
m.Result = (IntPtr)HTTOPRIGHT;
else if (vPoint.Y >= ClientSize.Height - 5)
m.Result = (IntPtr)HTBOTTOMRIGHT;
else m.Result = (IntPtr)HTRIGHT;
else if (vPoint.Y <= 5)
m.Result = (IntPtr)HTTOP;
else if (vPoint.Y >= ClientSize.Height - 5)
m.Result = (IntPtr)HTBOTTOM;
break;
}
}
WUSUSU 2007-10-23
  • 打赏
  • 举报
回复
我看到了获取一个窗口的句柄(GetWindowDC(m.HWnd);),但不知道如何获取一个控件的句柄,请详细讲解一下。
WUSUSU 2007-10-23
  • 打赏
  • 举报
回复
[DllImport("user32.dll")]
private static extern IntPtr GetWindowDC(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);

private const int WM_NCPAINT = 0x0085;
private const int WM_NCACTIVATE = 0x0086;
private const int WM_NCLBUTTONDOWN = 0x00A1;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
//Rectangle vRectangle = new Rectangle(0,0, Width, 22);
Rectangle rect1 = new Rectangle(0, 0, 50, 50);
Rectangle rect2 = new Rectangle(25, 0, Width-50, 25);
Rectangle rect3 = new Rectangle(Width-50, 0, 50, 50);
switch (m.Msg)
{
case WM_NCPAINT:
IntPtr vHandle = GetWindowDC(m.HWnd);
Graphics vGraphics = Graphics.FromHdc(vHandle);
vGraphics.FillRectangle(new SolidBrush(Color.White), 0.0f, 0.0f, 25.0f, 25.0f);
vGraphics.FillRectangle(new SolidBrush(Color.White), Width-50, 0.0f, 50.0f, 25.0f);
vGraphics.FillPie(new LinearGradientBrush(rect1,
Color.Pink, Color.Purple, LinearGradientMode.Vertical),
rect1, -90.0f, -90.0f);
vGraphics.FillRectangle(new LinearGradientBrush(rect2,
Color.Pink, Color.Purple, LinearGradientMode.Vertical),
rect2);
vGraphics.FillPie(new LinearGradientBrush(rect3,
Color.Pink, Color.Purple, LinearGradientMode.Vertical),
rect3, 0.0f, -90.0f);
StringFormat vStringFormat = new StringFormat();
vStringFormat.Alignment = StringAlignment.Center;
vStringFormat.LineAlignment = StringAlignment.Center;
vGraphics.DrawString("1", Font, Brushes.BlanchedAlmond,
rect1, vStringFormat);
vGraphics.Dispose();
ReleaseDC(m.HWnd, vHandle);
break;
case WM_NCACTIVATE:
IntPtr vHandle2 = GetWindowDC(m.HWnd);
Graphics vGraphics2 = Graphics.FromHdc(vHandle2);
vGraphics2.FillPie(new LinearGradientBrush(rect1,
Color.Pink, Color.Purple, LinearGradientMode.Vertical),
rect1, -90.0f, -90.0f);
vGraphics2.FillRectangle(new LinearGradientBrush(rect2,
Color.Pink, Color.Purple, LinearGradientMode.Vertical),
rect2);
vGraphics2.FillPie(new LinearGradientBrush(rect3,
Color.Pink, Color.Purple, LinearGradientMode.Vertical),
rect3, 0.0f, -90.0f);

StringFormat vStringFormat2 = new StringFormat();
vStringFormat2.Alignment = StringAlignment.Center;
vStringFormat2.LineAlignment = StringAlignment.Center;
vGraphics2.DrawString("2", Font, Brushes.BlanchedAlmond,
rect1, vStringFormat2);

vGraphics2.Dispose();
ReleaseDC(m.HWnd, vHandle2);
break;

case WM_NCLBUTTONDOWN:
Point vPoint = new Point((int)m.LParam);
vPoint.Offset(-Left, -Top);
if (vRectangle.Contains(vPoint))
MessageBox.Show(vPoint.ToString());
break;
}
在你的基础上改的,现在就是要看看他的特点
王集鹄 2007-10-23
  • 打赏
  • 举报
回复
楼主你最好将你调试的代码贴出,否则也不知道你是咋画的
ansili521 2007-10-23
  • 打赏
  • 举报
回复
支持17楼
..正解
WUSUSU 2007-10-23
  • 打赏
  • 举报
回复
我在非客户区画了一个圆角矩形,但是没有遮掩的角上还是显示原来标题的背景颜色,这该怎么处理啊
WUSUSU 2007-10-23
  • 打赏
  • 举报
回复
请问一下,是否有API函数的全集啊,找了半天找不到,想去找一个详细点的教程
王集鹄 2007-10-23
  • 打赏
  • 举报
回复
窗体移动在25楼的基础上加如下语句

const int HTCAPTION = 2;
//....
else if (vPoint.Y < 30)
m.Result = (IntPtr)HTCAPTION;
break;


WindowState = FormWindowState.Minimized; // 最小化
WindowState = FormWindowState.Maximized; // 最大化
WindowState = FormWindowState.Normal; // 还原
Close(); // 关闭
zcygo 2007-10-23
  • 打赏
  • 举报
回复
UPUP
WUSUSU 2007-10-23
  • 打赏
  • 举报
回复
还有个问题问一下,我画好后,把文字(也就是标题)和控制按钮都放上去了。但是如何实现窗口的移动,关闭,最大化,最小话呢?多谢
加载更多回复(20)

110,570

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧