Click here to Skip to main content
15,895,667 members
Articles / Desktop Programming / MFC

MDISnap

Rate me:
Please Sign up or sign in to vote.
5.00/5 (24 votes)
29 Nov 2004CPOL4 min read 129.1K   4K   47  
Do your users a favor - add snapping edges to MDI child windows (or anywhere else).
// MDISnapper.h: interface for the CMDISnapper class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MDISNAPPER_H__C7094C4B_78CF_4B26_BF01_26C80F1A0F0F__INCLUDED_)
#define AFX_MDISNAPPER_H__C7094C4B_78CF_4B26_BF01_26C80F1A0F0F__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


struct SNAPINFO
{
	enum { MAXDELTA = (1<<30) };

	DWORD	snapWidth;

	RECT	rold;
	RECT	rnew;
	RECT	rdelta;

	RECT	rout;

	void	Init(RECT const & oldRect, RECT const & newRect, DWORD snapwidth);
	void	Init(RECT const & r, DWORD snapWidth, bool moveOnly = false);
	void	SnapHLine(long y);		// snap to a horizontal line
	void	SnapVLine(long x);		// snap to a vertical line

	RECT &	EndSnap();  // final coords in rout
};





class CMDISnapper  
{
public:

protected:
	DWORD				m_snapWidth;
    bool                m_bSizeMoveIsSysCommand;    ///< size/move was selected from the menu

	// helper for "move" coordinates
	CWnd *				m_wndMoving; 
	POINT				m_mouseStart;
	RECT                m_rectStart;

    // helper for swap
    CWnd *              m_swapOther;
    RECT                m_swapOtherRect;

    CWnd * PickSwapWindow(CWnd * base, POINT mouse);


public:
			 CMDISnapper(DWORD snapWidth = 8);
	virtual ~CMDISnapper();

	void	SetSnapWidth(DWORD snapWidth);
	DWORD	GetSnapWidth() const		{ return m_snapWidth; }

	LRESULT	OnMessage(CWnd * wnd, UINT msg, WPARAM wp, LPARAM lp);

  	void	Sizing(CWnd * wnd, RECT & rnew);

	void	OnEnterSizeMove(CWnd * wnd);
	void	OnExitSizeMove();
	void	OnSizing(CWnd * wnd, WPARAM edge, LPRECT newrect);
	void	OnMoving(CWnd * wnd, WPARAM edge, LPRECT newrect);

    virtual bool AllowSnap();



};

#endif // !defined(AFX_MDISNAPPER_H__C7094C4B_78CF_4B26_BF01_26C80F1A0F0F__INCLUDED_)


/*

  XSgn is required for the following setup:

		  Snap 1        Snap 2
			|             |
			|        |  | |
                     |<-|
					 |<-|
					 |  |
				  rnew  rold

		although rnew is closer to snap2, we should snap to snap1
		since user wants "move to left"


*/

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Klippel
Germany Germany
Peter is tired of being called "Mr. Chen", even so certain individuals insist on it. No, he's not chinese.

Peter has seen lots of boxes you youngsters wouldn't even accept as calculators. He is proud of having visited the insides of a 16 Bit Machine.

In his spare time he ponders new ways of turning groceries into biohazards, or tries to coax South American officials to add some stamps to his passport.

Beyond these trivialities Peter works for Klippel[^], a small german company that wants to make mankind happier by selling them novel loudspeaker measurement equipment.


Where are you from?[^]



Please, if you are using one of my articles for anything, just leave me a comment. Seeing that this stuff is actually useful to someone is what keeps me posting and updating them.
Should you happen to not like it, tell me, too

Comments and Discussions