2013-11-27 1 views
1

양식의 크기를 조정할 때 깜박이지 않는 경계선없는 양식의 그림자를 만드는 방법이 있습니까? 지금 CreateParams를 사용하고 있습니다.경계선없는 양식의 깜박임 그림자

protected override CreateParams CreateParams 
{ 
    get 
    { 
     const int CS_DROPSHADOW = 0x20000; 
     CreateParams cp = base.CreateParams; 
     cp.ClassStyle |= CS_DROPSHADOW; 
     return cp; 
    } 
} 

그러나 폼의 크기를 조정할 때, 그림자 부분은 점멸, 그림자에 다시 흰색으로 변합니다. 양식의 나머지 부분은 내가 사용했기 때문에 사용하지 않았습니다. this.DoubleBuffered = true;
어떤 도움을 주셔서 감사합니다, 감사합니다!

편집 :
내가

dir sendMessage 첨부

private const int WM_NCLBUTTONDOWN = 0xa1;
SendMessage(handle, WM_NCLBUTTONDOWN, dir, 0); 사용하여 폼의 크기를 조정하는 것은 내가 양식의 크기를 조정하려는 방향에 따라 변화하는 int입니다.

+1

'양식의 크기가 변경 될 때 깜박이지 않는 경계선없는 양식의 그림자를 만드는 방법이 있습니까? '- 예, WPF라고합니다. –

+0

은 경계선없는 양식처럼 보이며 문제를 일으킬 수있는 크기 조정 동작을 사용자 정의합니다. –

+0

'그림자 부분이 흰색으로 변한 다음 그림자로 돌아 간다'는 점을 분명히 해 주시겠습니까? 언제 그런 일이 일어 났습니까? 테두리 (왼쪽, 위쪽, 오른쪽, 아래쪽) 또는 위쪽과 왼쪽 (크기가 깜박이는 가장자리는 각각 아래쪽 및 오른쪽)의 크기를 조정할 때마다 발생합니다. 약간의 사용자 지정 크기 조정 코드를 시도했는데 그 문제가 유일한 문제입니다 (위쪽 가장자리와 왼쪽 가장자리의 크기를 조정하면 반대쪽 가장자리가 약간 깜박임) –

답변

1

귀하의 문제는 귀하의 질문에 게시 된 SendMessage을 사용하여 사용자 지정 크기 조정을 지원하기 위해 귀하의 구현으로 인한 것 같아요. 메시지 WM_NCHITTEST 잡기 WndProc 사용하여 크기 조정 구현 시도하고 결과에 따라 마우스 위치로 반환합니다. 위쪽 가장자리와 왼쪽 가장자리의 크기를 조정할 때 깜박임이별로없고 다른 가장자리는 깜박 거리지 않는 것처럼 보입니다. 그래서 나는 그것이 나를 위해 작동,이 코드를 시도 할 수 있다고 생각 : SendMessage와 사용자 정의 크기 조정을 사용하지 않는

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     DoubleBuffered = true; 
     FormBorderStyle = FormBorderStyle.None; 
    } 
    protected override CreateParams CreateParams 
    { 
     get 
     { 
      const int CS_DROPSHADOW = 0x20000; 
      CreateParams cp = base.CreateParams; 
      cp.ClassStyle |= CS_DROPSHADOW; 
      return cp; 
     } 
    } 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x84) //WM_NCHITTEST = 0x84 
     { 
      int x = m.LParam.ToInt32() & 0xffff; 
      int y = m.LParam.ToInt32() >> 16; 
      int codex, codey; 
      Point p = PointToClient(new Point(x, y)); 
      codey = p.Y < 5 ? 2 : p.Y > ClientSize.Height - 5 ? 1 : 0; 
      codex = p.X < 5 ? 2 : p.X > ClientSize.Width - 5 ? 1 : 0; 
      switch (codex + (codey<<2)) 
      { 
       case 10://Top-Left 
        m.Result = (IntPtr)13; 
        return; 
       case 8://Top 
        m.Result = (IntPtr)12; 
        return; 
       case 9://Top-Right 
        m.Result = (IntPtr)14; 
        return; 
       case 2://Left 
        m.Result = (IntPtr)10; 
        return; 
       case 1://Right 
        m.Result = (IntPtr)11; 
        return; 
       case 6://Bottom-Left 
        m.Result = (IntPtr)16; 
        return; 
       case 4://Bottom 
        m.Result = (IntPtr)15; 
        return; 
       case 5://Bottom-Right; 
        m.Result = (IntPtr)17; 
        return; 
      }     
     } 
     base.WndProc(ref m); 
    } 
} 

참고, 위의 코드 만.

+0

와우! 고마워, 나는 WinProc을 사용하지 않을 것이다. – Blue0500

+0

이봐 요, 그냥 스위치 끝에 기본 statatement를 추가하면 m.Result = (IntPtr) 0x2 – Blue0500

+0

@ Blue0500을 사용하여 양식의 크기를 조정할 수 있다는 것을 알았습니까? 우리는 기본 케이스를 처리하지 않습니다. 기본 케이스는 마우스가 모서리 또는 모퉁이 (클라이언트 영역 내부에있을 때)가 아닌 경우에 해당합니다. BTW, 윈도우가이 메시지를 받으면 DefWndProc가 처리하고 hittest 코드라고하는 결과를 반환하는 WM_NCHITTEST에 대해 더 많이 검색 할 수 있습니다. 이것은 리사이징, 캡쳐 등과 같은 마우스의 동작을 결정하는 데 사용됩니다. –

관련 문제