<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="http://program.alphabrend.com/modules/pukiwiki/skin/rss.xml" ?>
<rdf:RDF 
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xml:lang="ja">

 <channel rdf:about="http://program.alphabrend.com/modules/pukiwiki/28.html">
  <title>アルファブレンド　プログラミングチップス-TIPS/VisualC++</title>
  <link>http://program.alphabrend.com/modules/pukiwiki/28.html</link>
  <description>Visual C++によるプログラミングチップスを公開しています。</description>
  <dc:date>2008-10-16T01:08:12+09:00</dc:date>
  <items>
   <rdf:Seq>
    <rdf:li rdf:resource="http://program.alphabrend.com/modules/pukiwiki/36.html" />
    <rdf:li rdf:resource="http://program.alphabrend.com/modules/pukiwiki/45.html" />
    <rdf:li rdf:resource="http://program.alphabrend.com/modules/pukiwiki/37.html" />
    <rdf:li rdf:resource="http://program.alphabrend.com/modules/pukiwiki/35.html" />
    <rdf:li rdf:resource="http://program.alphabrend.com/modules/pukiwiki/34.html" />
    <rdf:li rdf:resource="http://program.alphabrend.com/modules/pukiwiki/33.html" />
    <rdf:li rdf:resource="http://program.alphabrend.com/modules/pukiwiki/32.html" />
    <rdf:li rdf:resource="http://program.alphabrend.com/modules/pukiwiki/28.html" />

   </rdf:Seq>
  </items>
 </channel>

<item rdf:about="http://program.alphabrend.com/modules/pukiwiki/36.html">
 <title>縦書きエディットコントロール</title>
 <link>http://program.alphabrend.com/modules/pukiwiki/36.html</link>
 <dc:date>2008-10-14T16:55:50+09:00</dc:date>
 <description>[付箋:4]さっき、偽物VisualStadioのページにジャンプしてみたが・・・&amp;#182;[付箋:3]さっき、偽物VisualStadioのページにジャンプしてみたが・・・&amp;#182;[付箋:2]本日は&amp;#182;[付箋:1]ｄｄｄ&amp;#182;http://program.alphabrend.com/module&amp;#173;s/mydownloads/visit.php?cid=1lid=1...</description>
<content:encoded>
<![CDATA[
縦書きエディットコントロール<br />
MFCで縦書きエディットコントロールを作成しました。<br />
そもそもエディットコントロールは<br />
CWndを派生してその上に描画を行っているので<br />
同様のことをすればいろいろ作れます。<br />
以下でダウンロードできます。<br />
VC7で動作確認済。<br />
DLLをプログラムと同じ位置に置き、<br />
プロジェクトののプロパティのリンク入力で<br />
付属のlibを入力。<br />
ダイアログ上にカスタムコントロールを配置し、<br />
プロパティでClassをTategakiEditCtrlにしてください。<br />
あとはCTateEditというクラスで<br />
コントロール変数を作成し、<br />
ヘッダファイルをインクルードしてください。<br />
http://program.alphabrend.com/module&#173;s/mydownloads/visit.php?cid=1&amp;lid=1
]]>
</content:encoded>
<dc:creator>dala, ゲスト</dc:creator>
</item>

<item rdf:about="http://program.alphabrend.com/modules/pukiwiki/45.html">
 <title>windows98でリッチエディットが動かない？</title>
 <link>http://program.alphabrend.com/modules/pukiwiki/45.html</link>
 <dc:date>2006-11-12T14:32:05+09:00</dc:date>
 <description>もしくは直接rcファイルを編集しても良いでしょう。...windows98でリッチエディットが動かない？ VCでリッチエディットを使っているプログラムを作成したのだけど、		windows98では動かないことがあります。原因はwindows98ではリッチエディット2が使えないためです。		ダイアログエディタにはリッチエディット2しかありません。これに対応するには、		カスタムコントロールを配置し、		そこに以下のプロパティを設定します。		Class : RICHEDIT		必要であれば以下も設...</description>
<content:encoded>
<![CDATA[
windows98でリッチエディットが動かない？<br />
VCでリッチエディットを使っているプログラムを作成したのだけど、		windows98では動かないことがあります。<br />
原因はwindows98ではリッチエディット2が使えないためです。		ダイアログエディタにはリッチエディット2しかありません。<br />
これに対応するには、		カスタムコントロールを配置し、		そこに以下のプロパティを設定します。		Class : RICHEDIT		必要であれば以下も設定してください。		Extended Style : 0x204		Style : 0x50010080<br />
もしくは直接rcファイルを編集しても良いでしょう。<br />
これで今までと同様にリッチエディットを使用できます。		クラスウィザードでCRichEditCtrlを作成することもできます。
]]>
</content:encoded>
<dc:creator>dala</dc:creator>
</item>

<item rdf:about="http://program.alphabrend.com/modules/pukiwiki/37.html">
 <title>CDockBarを継承する</title>
 <link>http://program.alphabrend.com/modules/pukiwiki/37.html</link>
 <dc:date>2006-06-08T22:04:13+09:00</dc:date>
 <description>				 	WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_CHILD|WS_VISIBLE |&amp;#182;				 	WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_CHILD|WS_VISIBLE |&amp;#182;ドッキング時にサイズ変更したりするのには、CDockBarはWM_SIZEPARENTのメッセージを受けてOnSizeParentを実行しているのですが、これがPreTranslateMessage関数などを使用しても改造することができませ...</description>
<content:encoded>
<![CDATA[
CDockBarを継承する<br />
ツールバーなどのコントロールバーが<br />
ドッキング時にサイズ変更したりするのには、<br />
CDockBarが使用されています。<br />
CDockBarはWM_SIZEPARENTのメッセージを受けて<br />
OnSizeParentを実行しているのですが、<br />
これがPreTranslateMessage関数などを使用しても<br />
改造することができません。<br />
これを改造するためには<br />
まずCDockBarを継承したクラスを作成することが必要です。<br />
ところがCDockBarはVC.NETでは何故か継承候補として選べません。<br />
ですのでとりあえずCControlBarを継承し、<br />
手書きでクラスをCDockBarに置き換えれば大丈夫です。<br />
以下の感じになります。<br />
// ExtDockBar.cpp<br />
#include "ExtDockBar.h"<br />
IMPLEMENT_DYNAMIC(CExtDockBar, CDockBar)<br />
CExtDockBar::CExtDockBar()<br />
{<br />
}<br />
CExtDockBar::~CExtDockBar()<br />
{<br />
}<br />
BEGIN_MESSAGE_MAP(CExtDockBar, CDockBar)<br />
	ON_MESSAGE(WM_SIZEPARENT, OnSizeParent)<br />
END_MESSAGE_MAP()<br />
// CExtDockBar メッセージ ハンドラ<br />
void CExtDockBar::OnUpdateCmdUI(CFrameWnd* /*pTarget*/, BOOL /*bDisableIfNoHndler*/)<br />
{<br />
}<br />
LRESULT CExtDockBar::OnSizeParent(WPARAM wParam, LPARAM lParam)<br />
{<br />
	if( theApp.m_pMainWnd &amp;&amp; theApp.m_pMainWnd-&gt;m_hWnd &amp;&amp; theApp.m_pMainWnd-&gt;IsIconic() )<br />
	{<br />
		theApp.m_pMainWnd-&gt;OpenIcon();<br />
	}<br />
	return CDockBar::OnSizeParent( wParam, lParam );<br />
}<br />
// CExtDockBar<br />
#pragma once<br />
class CExtDockBar : public CDockBar<br />
{<br />
	DECLARE_DYNAMIC(CExtDockBar)<br />
public:<br />
	CExtDockBar();<br />
	virtual ~CExtDockBar();<br />
	virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler);<br />
protected:<br />
	//{{AFX_MSG(CExtDockBar)<br />
	afx_msg LRESULT OnSizeParent(WPARAM, LPARAM);<br />
	//}}AFX_MSG<br />
	DECLARE_MESSAGE_MAP()<br />
};<br />
で、クラスを作るだけではしょうがないので、<br />
CDockBarをCExtDockBarに置き換えるために、<br />
デフォルトでCDockBarを作成している場所を改造します。<br />
EnableDocking関数を最初に使用していると思いますが、<br />
この関数の代わりにExtEnableDocking関数を作って<br />
そちらを使用するようにします。<br />
void CMainFrame::ExtEnableDocking(DWORD dwDockStyle)<br />
{<br />
	// must be CBRS_ALIGN_XXX or CBRS_FLOAT_MULTI only<br />
	ASSERT((dwDockStyle &amp; ~(CBRS_ALIGN_ANY|CBRS_FLOAT_MULTI)) == 0);<br />
	m_pFloatingFrameClass = RUNTIME_CLASS(CMiniDockFrameWnd);<br />
	for (int i = 0; i &lt; 4; i++)<br />
	{<br />
		if (dwDockBarMap[i][1] &amp; dwDockStyle &amp; CBRS_ALIGN_ANY)<br />
		{<br />
			CDockBar* pDock = (CDockBar*)GetControlBar(dwDockBarMap[i][0]);<br />
			if (pDock == NULL)<br />
			{<br />
				CExtDockBar *pExtDock = new CExtDockBar;<br />
				if (!pExtDock-&gt;Create(this,<br />
				 	WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_CHILD|WS_VISIBLE |<br />
						dwDockBarMap[i][1], dwDockBarMap[i][0]))<br />
				{<br />
					AfxThrowResourceException();<br />
				}<br />
			}<br />
		}<br />
	}<br />
}<br />
これで継承完了です。<br />
好きに改造することができます。<br />
改造すると言っても一体何ができるんだと思いますが…<br />
自分はoleサーバーをアイコン化してから<br />
Wordに貼り付けてあるオブジェクトをダブルクリックすると<br />
oleサーバーが開かれた時にツールバーなどの位置が<br />
バラバラになってしまうのでなおしてほしいという要望を受け<br />
やむなくMFCを睨みました。<br />
これもわりに合わない作業…
]]>
</content:encoded>
<dc:creator>dala</dc:creator>
</item>

<item rdf:about="http://program.alphabrend.com/modules/pukiwiki/35.html">
 <title>ツールバーに256色(8bit)の画像を使用する</title>
 <link>http://program.alphabrend.com/modules/pukiwiki/35.html</link>
 <dc:date>2006-05-28T23:10:57+09:00</dc:date>
 <description>ツールバーに256色(8bit)の画像を使用する ツールバーは通常4bit16色の画像以外を使用すると		正しく表示されません。		ですのでそれを修正したCExtToolBarを作成しました。面倒くさいので説明はしませんが、		下記と同様なクラスを作成し、		LoadToolBarを呼ぶ代わりにLoadExtToolBarを呼んでください。//ExtToolBar.cpp#include &quot;stdafx.h&quot;#include &quot;ExtToolBar.h&quot;struct CToolBarData{	...</description>
<content:encoded>
<![CDATA[
ツールバーに256色(8bit)の画像を使用する<br />
ツールバーは通常4bit16色の画像以外を使用すると		正しく表示されません。		ですのでそれを修正したCExtToolBarを作成しました。<br />
面倒くさいので説明はしませんが、		下記と同様なクラスを作成し、		LoadToolBarを呼ぶ代わりにLoadExtToolBarを呼んでください。<br />
//ExtToolBar.cpp<br />
#include "stdafx.h"<br />
#include "ExtToolBar.h"<br />
struct CToolBarData<br />
{<br />
	WORD wVersion;<br />
	WORD wWidth;<br />
	WORD wHeight;<br />
	WORD wItemCount;<br />
	//WORD aItems[wItemCount]<br />
	WORD* items()<br />
		{ return (WORD*)(this+1); }<br />
};<br />
IMPLEMENT_DYNAMIC(CExtToolBar, CToolBar)<br />
CExtToolBar::CExtToolBar()<br />
{<br />
}<br />
CExtToolBar::~CExtToolBar()<br />
{<br />
}<br />
BEGIN_MESSAGE_MAP(CExtToolBar, CToolBar)<br />
END_MESSAGE_MAP()<br />
BOOL CExtToolBar::LoadExtToolBar(UINT nIDResource)<br />
{<br />
	return LoadExtToolBar(MAKEINTRESOURCE(nIDResource));<br />
}<br />
BOOL CExtToolBar::LoadExtToolBar(LPCTSTR lpszResourceName)<br />
{<br />
	switch( GetBitCount( lpszResourceName ) )<br />
	{<br />
	case 8:<br />
		return LoadExtToolBarNot4( lpszResourceName, ILC_COLOR8 );<br />
	}<br />
	return LoadToolBar( lpszResourceName );<br />
}<br />
BOOL CExtToolBar::LoadExtToolBarNot4( LPCTSTR lpszResourceName, int depth )<br />
{<br />
	CImageList		img;<br />
	CBitmap			bmp;<br />
	HIMAGELIST		himg;<br />
	HBITMAP			hbmp;<br />
	int				i;<br />
	UINT			*pItems;<br />
	BOOL			bResult;<br />
	HINSTANCE hInst = AfxFindResourceHandle(lpszResourceName, RT_TOOLBAR);<br />
	HRSRC hRsrc = ::FindResource(hInst, lpszResourceName, RT_TOOLBAR);<br />
	if (hRsrc == NULL)<br />
		return FALSE;<br />
	HGLOBAL hGlobal = LoadResource(hInst, hRsrc);<br />
	if (hGlobal == NULL)<br />
		return FALSE;<br />
	CToolBarData* pData = (CToolBarData*)LockResource(hGlobal);<br />
	if (pData == NULL)<br />
		return FALSE;<br />
	ASSERT(pData-&gt;wVersion == 1);<br />
	himg	= ImageList_Create( 16, 15, depth | ILC_MASK, 0, 32 );<br />
	bmp.LoadBitmap( lpszResourceName );<br />
	hbmp	= (HBITMAP)bmp.GetSafeHandle();<br />
	ImageList_AddMasked( himg, hbmp, RGB(192,192,192) );<br />
	img.Attach( himg );<br />
	GetToolBarCtrl().SetImageList( &amp;img );<br />
	img.Detach();<br />
	DeleteObject( himg );<br />
	bmp.DeleteObject();<br />
	SetSizes( CSize(16 + 7,15 + 6), CSize(16,15) );<br />
	pItems	= new UINT[pData-&gt;wItemCount];<br />
	for( i = 0; i &lt; (int)pData-&gt;wItemCount; i++ )<br />
	{<br />
		pItems[i]	= pData-&gt;items()[i];<br />
	}<br />
	bResult	= SetButtons( pItems, pData-&gt;wItemCount );<br />
	UnlockResource(hGlobal);<br />
	FreeResource(hGlobal);<br />
	delete[] pItems;<br />
	return TRUE;<br />
}<br />
int CExtToolBar::GetBitCount(UINT nIDResource)<br />
{<br />
	return GetBitCount(MAKEINTRESOURCE(nIDResource));<br />
}<br />
int CExtToolBar::GetBitCount( LPCTSTR lpszResourceName )<br />
{<br />
	HINSTANCE	hInst = AfxFindResourceHandle(lpszResourceName,RT_BITMAP);<br />
	HRSRC		hRsrc = ::FindResource(hInst,lpszResourceName,RT_BITMAP);<br />
	int			bitcount;<br />
	if (hRsrc == NULL){<br />
		hInst = NULL;<br />
		hRsrc = ::FindResource(hInst,lpszResourceName,RT_BITMAP);<br />
	}<br />
	if (hRsrc == NULL)return 0;<br />
	// determine how many colors in the bitmap<br />
	HGLOBAL hglb;<br />
	if ((hglb = LoadResource(hInst, hRsrc)) == NULL)<br />
		return 0;<br />
	LPBITMAPINFOHEADER lpBitmap = (LPBITMAPINFOHEADER)LockResource(hglb);<br />
	if (lpBitmap == NULL)return 0;<br />
	bitcount	= lpBitmap-&gt;biBitCount;<br />
	::FreeResource(hglb);<br />
	return bitcount;<br />
}<br />
//CExtToolBar.h<br />
#pragma once<br />
// CExtToolBar<br />
class CExtToolBar : public CToolBar<br />
{<br />
	DECLARE_DYNAMIC(CExtToolBar)<br />
public:<br />
	CExtToolBar();<br />
	virtual ~CExtToolBar();<br />
protected:<br />
	DECLARE_MESSAGE_MAP()<br />
protected:<br />
	BOOL LoadExtToolBarNot4( LPCTSTR lpszResourceName, int depth );<br />
public:<br />
	BOOL LoadExtToolBar(UINT nIDResource);<br />
	BOOL LoadExtToolBar(LPCTSTR lpszResourceName);<br />
	int GetBitCount( UINT nIDResource );<br />
	int GetBitCount( LPCTSTR lpszResourceName );<br />
};
]]>
</content:encoded>
<dc:creator>dala</dc:creator>
</item>

<item rdf:about="http://program.alphabrend.com/modules/pukiwiki/34.html">
 <title>フローティング中のツールバーを斜めにサイズ変更できるようにする</title>
 <link>http://program.alphabrend.com/modules/pukiwiki/34.html</link>
 <dc:date>2006-05-28T23:10:17+09:00</dc:date>
 <description>フローティング中のツールバーを斜めにサイズ変更できるようにする ツールバーなどのコントロールバーはフローティング中、		通常縦横にしかサイズ変更ができません。		カーソルをあわせても斜めのカーソルがでません。		まずはそれを修正します。コントロールバーがフローティングを実現する時には、		CMiniDockFrameWndというクラスのウィンドウの		子（孫）ウィンドウになっています。		このCMiniDockFrameWndがカーソルを制御しています。下記のCMiniDockFrameWndの...</description>
<content:encoded>
<![CDATA[
フローティング中のツールバーを斜めにサイズ変更できるようにする<br />
ツールバーなどのコントロールバーはフローティング中、		通常縦横にしかサイズ変更ができません。		カーソルをあわせても斜めのカーソルがでません。		まずはそれを修正します。<br />
コントロールバーがフローティングを実現する時には、		CMiniDockFrameWndというクラスのウィンドウの		子（孫）ウィンドウになっています。		このCMiniDockFrameWndがカーソルを制御しています。<br />
下記のCMiniDockFrameWndの派生元クラス		CMiniFrameWndのOnNcHitTestの部分で		縦横にしかカーソルがでないようにしています。<br />
	if (dwStyle &amp; MFS_4THICKFRAME)<br />
	{<br />
		switch (nHit)<br />
		{<br />
		case HTTOPLEFT:<br />
			return point.y &lt; rectWindow.top ? HTTOP : HTLEFT;<br />
		case HTTOPRIGHT:<br />
			return point.y &lt; rectWindow.top ? HTTOP : HTRIGHT;<br />
		case HTBOTTOMLEFT:<br />
			return point.y &gt; rectWindow.bottom ? HTBOTTOM : HTLEFT;<br />
		case HTGROWBOX:<br />
		case HTBOTTOMRIGHT:<br />
			return point.y &gt; rectWindow.bottom ? HTBOTTOM : HTRIGHT;<br />
		}<br />
	}<br />
ですので、CMiniDockFrameWndのウィンドウスタイルから		MFS_4THICKFRAMEを消してしまいましょう。		CControlBarから継承したクラスCMyControlBarに		以下の二つの関数を追加すればOKです。<br />
CMiniDockFrameWnd* CMyControlBar::GetMiniDockFrameWnd()<br />
{<br />
	CWnd				*pWnd;<br />
	if( m_hWnd )<br />
	{<br />
		if( pWnd = GetParent() )<br />
		{<br />
			if( pWnd = pWnd-&gt;GetParent() )<br />
			{<br />
				if( pWnd-&gt;IsKindOf( RUNTIME_CLASS( CMiniDockFrameWnd ) ) )<br />
				{<br />
					return (CMiniDockFrameWnd*)pWnd;<br />
				}<br />
			}<br />
		}<br />
	}<br />
	return 0;<br />
}<br />
void CMyControlBar::OnSize(UINT nType, int cx, int cy)<br />
{<br />
	CControlBar::OnSize(nType, cx, cy);<br />
	if( GetMiniDockFrameWnd() )<br />
	{<br />
		GetMiniDockFrameWnd()-&gt;ModifyStyle( MFS_4THICKFRAME, 0 );<br />
	}<br />
}<br />
これで斜めにもカーソルがでるようになります。		…が、まだサイズ変更はできません。		この原因を確かめるべく、		CMiniDockFrameWndのOnNcLButtonDownから追っていくと、<br />
pBar-&gt;m_pDockContext-&gt;StartResize(nHitTest, point);		↓		Stretch(pt);<br />
という関数のこの部分<br />
	if (m_nHitTest == HTLEFT || m_nHitTest == HTRIGHT)<br />
	{<br />
		if (m_nHitTest == HTLEFT)<br />
			m_rectRequestedSize.left += ptOffset.x;<br />
		else<br />
			m_rectRequestedSize.right += ptOffset.x;<br />
		nLength = m_rectRequestedSize.Width();<br />
	}<br />
	else<br />
	{<br />
		dwMode |= LM_LENGTHY;<br />
		if (m_nHitTest == HTTOP)<br />
			m_rectRequestedSize.top += ptOffset.y;<br />
		else<br />
			m_rectRequestedSize.bottom += ptOffset.y;<br />
		nLength = m_rectRequestedSize.Height();<br />
	}<br />
このように上下左右しか扱っていません。		なので、HitTestが斜めの時は斜めに操作できるように		処理を奪い取りましょう。<br />
アプリケーションクラスに以下の処理を追加してください。		長いですが。<br />
BOOL CMyApp::PreTranslateMessage(MSG* pMsg)<br />
{<br />
	CMiniDockFrameWnd	*pMiniWnd = 0;<br />
	BOOL				bMiniWnd;<br />
	CPoint				pos;<br />
	switch( pMsg-&gt;message )<br />
	{<br />
	case WM_NCLBUTTONDOWN:<br />
		pMiniWnd	= m_myBar.GetMiniDockFrameWnd();<br />
		if( pMiniWnd &amp;&amp; pMiniWnd-&gt;m_hWnd == pMsg-&gt;hwnd )<br />
		{<br />
			switch( pMsg-&gt;wParam )<br />
			{<br />
			case HTTOPLEFT:<br />
			case HTTOPRIGHT:<br />
			case HTBOTTOMLEFT:<br />
			case HTBOTTOMRIGHT:<br />
				pos.x	= (LONG)pMsg-&gt;lParam &amp; 0xFFFF;<br />
				pos.y	= (LONG)pMsg-&gt;lParam &gt;&gt; 16;<br />
				StretchWnd( pMiniWnd, (int)pMsg-&gt;wParam, pos );<br />
				return TRUE;<br />
			}<br />
		}<br />
		break;<br />
	}<br />
	return CWinApp::PreTranslateMessage(pMsg);<br />
}<br />
#define m_rectRequestedSize     m_rectDragHorz<br />
#define m_rectActualSize        m_rectDragVert<br />
#define m_rectActualFrameSize   m_rectFrameDragHorz<br />
#define m_rectFrameBorders      m_rectFrameDragVert<br />
struct AUX_DATA<br />
{<br />
	// system metrics<br />
	int cxVScroll, cyHScroll;<br />
	int cxIcon, cyIcon;<br />
	int cxBorder2, cyBorder2;<br />
	// device metrics for screen<br />
	int cxPixelsPerInch, cyPixelsPerInch;<br />
	// convenient system color<br />
	HBRUSH hbrWindowFrame;<br />
	HBRUSH hbrBtnFace;<br />
	// color values of system colors used for CToolBar<br />
	COLORREF clrBtnFace, clrBtnShadow, clrBtnHilite;<br />
	COLORREF clrBtnText, clrWindowFrame;<br />
	// standard cursors<br />
	HCURSOR hcurWait;<br />
	HCURSOR hcurArrow;<br />
	HCURSOR hcurHelp;       // cursor used in Shift+F1 help<br />
	// special GDI objects allocated on demand<br />
	HFONT   hStatusFont;<br />
	HFONT   hToolTipsFont;<br />
	HBITMAP hbmMenuDot;<br />
	// other system information<br />
	BOOL    bWin95;         // TRUE if Windows 95 (not NT)<br />
// Implementation<br />
	AUX_DATA();<br />
	~AUX_DATA();<br />
	void UpdateSysColors();<br />
	void UpdateSysMetrics();<br />
};<br />
extern AUX_DATA afxData;<br />
void CMyApp::StretchWnd( CMiniDockFrameWnd *pMiniWnd, int nHitTest, CPoint pt )<br />
{<br />
	int nPos = 1;<br />
	CControlBar* pBar = NULL;<br />
	while(pBar == NULL &amp;&amp; nPos &lt; pMiniWnd-&gt;m_wndDockBar.m_arrBars.GetSize())<br />
	{<br />
		CControlBar* pResult = (CControlBar*)pMiniWnd-&gt;m_wndDockBar.m_arrBars[nPos];<br />
		if (DWORD_PTR(pResult) &lt;= 0xffff)<br />
			pBar	= NULL;<br />
		else<br />
			pBar	= pResult;<br />
	}<br />
	ASSERT(pBar != NULL);<br />
	ASSERT_KINDOF(CControlBar, pBar);<br />
	ASSERT(pBar-&gt;m_pDockContext != NULL);<br />
	// CBRS_SIZE_DYNAMIC toolbars cannot have the CBRS_FLOAT_MULTI style<br />
	ASSERT((pMiniWnd-&gt;m_wndDockBar.m_dwStyle &amp; CBRS_FLOAT_MULTI) == 0);<br />
	ASSERT_VALID(pBar-&gt;m_pDockContext-&gt;m_pBar);<br />
	ASSERT(pBar-&gt;m_pDockContext-&gt;m_pBar-&gt;m_dwStyle &amp; CBRS_SIZE_DYNAMIC);<br />
	pBar-&gt;m_pDockContext-&gt;m_bDragging = FALSE;<br />
	pBar-&gt;m_pDockContext-&gt;InitLoop();<br />
	// GetWindowRect returns screen coordinates(not mirrored)<br />
	// So if the desktop is mirrored then turn off mirroring<br />
	// for the desktop dc so that we draw correct focus rect<br />
	if (pBar-&gt;m_pDockContext-&gt;m_pDC-&gt;GetLayout() &amp; LAYOUT_RTL)<br />
		pBar-&gt;m_pDockContext-&gt;m_pDC-&gt;SetLayout(LAYOUT_LTR);<br />
	// get true bar size (including borders)<br />
	CRect rect;<br />
	pBar-&gt;m_pDockContext-&gt;m_pBar-&gt;GetWindowRect(rect);<br />
	pBar-&gt;m_pDockContext-&gt;m_ptLast = pt;<br />
	pBar-&gt;m_pDockContext-&gt;m_nHitTest = nHitTest;<br />
	CSize size = pBar-&gt;m_pDockContext-&gt;m_pBar-&gt;CalcDynamicLayout(0, LM_HORZ | LM_MRUWIDTH);<br />
	pBar-&gt;m_pDockContext-&gt;m_rectRequestedSize = CRect(rect.TopLeft(), size);<br />
	pBar-&gt;m_pDockContext-&gt;m_rectActualSize = CRect(rect.TopLeft(), size);<br />
	pBar-&gt;m_pDockContext-&gt;m_rectActualFrameSize = CRect(rect.TopLeft(), size);<br />
	// calculate frame rectangle<br />
	CMiniFrameWnd::CalcBorders(&amp;pBar-&gt;m_pDockContext-&gt;m_rectActualFrameSize);<br />
	pBar-&gt;m_pDockContext-&gt;m_rectActualFrameSize.InflateRect(-afxData.cxBorder2, -afxData.cyBorder2);<br />
	pBar-&gt;m_pDockContext-&gt;m_rectFrameBorders = CRect(CPoint(0,0),<br />
		pBar-&gt;m_pDockContext-&gt;m_rectActualFrameSize.Size() - pBar-&gt;m_pDockContext-&gt;m_rectActualSize.Size());<br />
	// initialize tracking state and enter tracking loop<br />
	pBar-&gt;m_pDockContext-&gt;m_dwOverDockStyle = 0;<br />
	StretchMiniWnd( pBar, pt );<br />
	TrackMiniWnd( pBar );<br />
	return;<br />
}<br />
void CMyApp::StretchMiniWnd( CControlBar* pBar, CPoint pt )<br />
{<br />
	CPoint ptOffset = pt - pBar-&gt;m_pDockContext-&gt;m_ptLast;<br />
	// offset all drag rects to new position<br />
	int nLength = 0;<br />
	DWORD dwMode = LM_HORZ;<br />
	switch( pBar-&gt;m_pDockContext-&gt;m_nHitTest )<br />
	{<br />
	case HTTOPLEFT:<br />
		pBar-&gt;m_pDockContext-&gt;m_rectRequestedSize.left	+= ptOffset.x;<br />
		pBar-&gt;m_pDockContext-&gt;m_rectRequestedSize.top	+= ptOffset.y;<br />
		break;<br />
	case HTTOPRIGHT:<br />
		pBar-&gt;m_pDockContext-&gt;m_rectRequestedSize.top	+= ptOffset.y;<br />
		pBar-&gt;m_pDockContext-&gt;m_rectRequestedSize.right	+= ptOffset.x;<br />
		break;<br />
	case HTBOTTOMLEFT:<br />
		pBar-&gt;m_pDockContext-&gt;m_rectRequestedSize.left	+= ptOffset.x;<br />
		pBar-&gt;m_pDockContext-&gt;m_rectRequestedSize.bottom	+= ptOffset.y;<br />
		break;<br />
	case HTBOTTOMRIGHT:<br />
		pBar-&gt;m_pDockContext-&gt;m_rectRequestedSize.right	+= ptOffset.x;<br />
		pBar-&gt;m_pDockContext-&gt;m_rectRequestedSize.bottom	+= ptOffset.y;<br />
		break;<br />
	}<br />
	CSize	size;<br />
	nLength = pBar-&gt;m_pDockContext-&gt;m_rectRequestedSize.Width();<br />
	nLength = (nLength &gt;= 0) ? nLength : 0;<br />
	size = pBar-&gt;m_pDockContext-&gt;m_pBar-&gt;CalcDynamicLayout(nLength, dwMode);<br />
	dwMode |= LM_LENGTHY;<br />
	nLength = pBar-&gt;m_pDockContext-&gt;m_rectRequestedSize.Height();<br />
	nLength = (nLength &gt;= 0) ? nLength : 0;<br />
	size = pBar-&gt;m_pDockContext-&gt;m_pBar-&gt;CalcDynamicLayout(nLength, dwMode);<br />
	CRect rectDesk;<br />
	HWND hWndDesk = ::GetDesktopWindow();<br />
	::GetWindowRect(hWndDesk, &amp;rectDesk);<br />
	CRect rectTemp = pBar-&gt;m_pDockContext-&gt;m_rectActualFrameSize;<br />
	CRect rect;<br />
	switch( pBar-&gt;m_pDockContext-&gt;m_nHitTest )<br />
	{<br />
	case HTTOPLEFT:<br />
		rectTemp.left = rectTemp.right - (size.cx + pBar-&gt;m_pDockContext-&gt;m_rectFrameBorders.Width());<br />
		rectTemp.top = rectTemp.bottom - (size.cy + pBar-&gt;m_pDockContext-&gt;m_rectFrameBorders.Height());<br />
		if (rect.IntersectRect(rectDesk, rectTemp))<br />
		{<br />
			pBar-&gt;m_pDockContext-&gt;m_rectActualSize.left = pBar-&gt;m_pDockContext-&gt;m_rectActualSize.right - size.cx;<br />
			pBar-&gt;m_pDockContext-&gt;m_rectActualSize.top = pBar-&gt;m_pDockContext-&gt;m_rectActualSize.bottom - size.cy;<br />
			pBar-&gt;m_pDockContext-&gt;m_rectActualFrameSize.left = rectTemp.left;<br />
			pBar-&gt;m_pDockContext-&gt;m_rectActualFrameSize.top = rectTemp.top;<br />
		}<br />
		break;<br />
	case HTTOPRIGHT:<br />
		rectTemp.right = rectTemp.left + (size.cx + pBar-&gt;m_pDockContext-&gt;m_rectFrameBorders.Width());<br />
		rectTemp.top = rectTemp.bottom - (size.cy + pBar-&gt;m_pDockContext-&gt;m_rectFrameBorders.Height());<br />
		if (rect.IntersectRect(rectDesk, rectTemp))<br />
		{<br />
			pBar-&gt;m_pDockContext-&gt;m_rectActualSize.top = pBar-&gt;m_pDockContext-&gt;m_rectActualSize.bottom - size.cy;<br />
			pBar-&gt;m_pDockContext-&gt;m_rectActualSize.right = pBar-&gt;m_pDockContext-&gt;m_rectActualSize.left + size.cx;<br />
			pBar-&gt;m_pDockContext-&gt;m_rectActualFrameSize.top = rectTemp.top;<br />
			pBar-&gt;m_pDockContext-&gt;m_rectActualFrameSize.right = rectTemp.right;<br />
		}<br />
		break;<br />
	case HTBOTTOMLEFT:<br />
		rectTemp.left = rectTemp.right - (size.cx + pBar-&gt;m_pDockContext-&gt;m_rectFrameBorders.Width());<br />
		rectTemp.bottom = rectTemp.top + (size.cy + pBar-&gt;m_pDockContext-&gt;m_rectFrameBorders.Height());<br />
		if (rect.IntersectRect(rectDesk, rectTemp))<br />
		{<br />
			pBar-&gt;m_pDockContext-&gt;m_rectActualSize.left = pBar-&gt;m_pDockContext-&gt;m_rectActualSize.right - size.cx;<br />
			pBar-&gt;m_pDockContext-&gt;m_rectActualSize.bottom = pBar-&gt;m_pDockContext-&gt;m_rectActualSize.top + size.cy;<br />
			pBar-&gt;m_pDockContext-&gt;m_rectActualFrameSize.left = rectTemp.left;<br />
			pBar-&gt;m_pDockContext-&gt;m_rectActualFrameSize.bottom = rectTemp.bottom;<br />
		}<br />
		break;<br />
	case HTBOTTOMRIGHT:<br />
		rectTemp.right = rectTemp.left + (size.cx + pBar-&gt;m_pDockContext-&gt;m_rectFrameBorders.Width());<br />
		rectTemp.bottom = rectTemp.top + (size.cy + pBar-&gt;m_pDockContext-&gt;m_rectFrameBorders.Height());<br />
		if (rect.IntersectRect(rectDesk, rectTemp))<br />
		{<br />
			pBar-&gt;m_pDockContext-&gt;m_rectActualSize.right = pBar-&gt;m_pDockContext-&gt;m_rectActualSize.left + size.cx;<br />
			pBar-&gt;m_pDockContext-&gt;m_rectActualSize.bottom = pBar-&gt;m_pDockContext-&gt;m_rectActualSize.top + size.cy;<br />
			pBar-&gt;m_pDockContext-&gt;m_rectActualFrameSize.right = rectTemp.right;<br />
			pBar-&gt;m_pDockContext-&gt;m_rectActualFrameSize.bottom = rectTemp.bottom;<br />
		}<br />
		break;<br />
	}<br />
	pBar-&gt;m_pDockContext-&gt;m_ptLast = pt;<br />
	// update feedback<br />
	pBar-&gt;m_pDockContext-&gt;DrawFocusRect();<br />
}<br />
BOOL CMyApp::TrackMiniWnd( CControlBar *pBar )<br />
{<br />
	// don't handle if capture already set<br />
	if (::GetCapture() != NULL)<br />
		return FALSE;<br />
	// set capture to the window which received this message<br />
	pBar-&gt;m_pDockContext-&gt;m_pBar-&gt;SetCapture();<br />
	ASSERT(pBar-&gt;m_pDockContext-&gt;m_pBar == CWnd::GetCapture());<br />
	// get messages until capture lost or cancelled/accepted<br />
	while (CWnd::GetCapture() == pBar-&gt;m_pDockContext-&gt;m_pBar)<br />
	{<br />
		MSG msg;<br />
		if (!::GetMessage(&amp;msg, NULL, 0, 0))<br />
		{<br />
			AfxPostQuitMessage((int)msg.wParam);<br />
			break;<br />
		}<br />
		switch (msg.message)<br />
		{<br />
		case WM_LBUTTONUP:<br />
			if (pBar-&gt;m_pDockContext-&gt;m_bDragging)<br />
				pBar-&gt;m_pDockContext-&gt;EndDrag();<br />
			else<br />
				pBar-&gt;m_pDockContext-&gt;EndResize();<br />
			return TRUE;<br />
		case WM_MOUSEMOVE:<br />
			if (pBar-&gt;m_pDockContext-&gt;m_bDragging)<br />
				pBar-&gt;m_pDockContext-&gt;Move(msg.pt);<br />
			else<br />
				StretchMiniWnd( pBar, msg.pt);<br />
			break;<br />
		case WM_KEYUP:<br />
			if (pBar-&gt;m_pDockContext-&gt;m_bDragging)<br />
				pBar-&gt;m_pDockContext-&gt;OnKey((int)msg.wParam, FALSE);<br />
			break;<br />
		case WM_KEYDOWN:<br />
			if (pBar-&gt;m_pDockContext-&gt;m_bDragging)<br />
				pBar-&gt;m_pDockContext-&gt;OnKey((int)msg.wParam, TRUE);<br />
			if (msg.wParam == VK_ESCAPE)<br />
			{<br />
				pBar-&gt;m_pDockContext-&gt;CancelLoop();<br />
				return FALSE;<br />
			}<br />
			break;<br />
		case WM_RBUTTONDOWN:<br />
			pBar-&gt;m_pDockContext-&gt;CancelLoop();<br />
			return FALSE;<br />
		// just dispatch rest of the messages<br />
		default:<br />
			DispatchMessage(&amp;msg);<br />
			break;<br />
		}<br />
	}<br />
	pBar-&gt;m_pDockContext-&gt;CancelLoop();<br />
	return FALSE;<br />
}<br />
ヘッダにもちゃんと上記で作成した関数の定義を		書いておいてください。		長いですがこれで完成です。<br />
時間と機能があまりにも割に合わない作業でした…。
]]>
</content:encoded>
<dc:creator>dala</dc:creator>
</item>

<item rdf:about="http://program.alphabrend.com/modules/pukiwiki/33.html">
 <title>縦書きコンボボックス</title>
 <link>http://program.alphabrend.com/modules/pukiwiki/33.html</link>
 <dc:date>2006-05-28T23:09:29+09:00</dc:date>
 <description>縦書きコンボボックス 縦書きといっても		通常のコンボボックスに縦書き描画しているだけなので		１文字目くらいしか表示されないと思います。まずCTategakiComboというクラスを作成し、		コンボボックスに割り当てます。CTategakiCombo m_combo;次にOnInitDialog等で縦書きフォントを割り当てます。m_combofont.CreateFont( 12, 0, 2700, 0, FW_NORMAL, 0, 0, 0,	ANSI_CHARSET | SHIFTJIS...</description>
<content:encoded>
<![CDATA[
縦書きコンボボックス<br />
縦書きといっても		通常のコンボボックスに縦書き描画しているだけなので		１文字目くらいしか表示されないと思います。<br />
まずCTategakiComboというクラスを作成し、		コンボボックスに割り当てます。<br />
CTategakiCombo m_combo;<br />
次にOnInitDialog等で縦書きフォントを割り当てます。<br />
m_combofont.CreateFont( 12, 0, 2700, 0, FW_NORMAL, 0, 0, 0,<br />
	ANSI_CHARSET | SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS,<br />
	CLIP_LH_ANGLES, DEFAULT_QUALITY, DEFAULT_PITCH, "@ＭＳ 明朝" );<br />
m_combo.SetFont( &amp;m_combofont );<br />
あとは正しく縦書きフォントを表示させるため、		CTategakiComboのDrawItemを継承し実装します。<br />
void CTategakiCombo::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)<br />
{<br />
	char		text[256];<br />
	CRect		rect;<br />
	CString		str;<br />
	COLORREF	oldcolor;<br />
	int			oldmode;<br />
	LOGFONT		logfont;<br />
	CFont		*font;<br />
	if( lpDrawItemStruct-&gt;itemID != -1 )<br />
	{<br />
		if( font = GetFont() )<br />
		{<br />
			if( font-&gt;GetLogFont( &amp;logfont ) )<br />
			{<br />
				oldmode	= SetBkMode( lpDrawItemStruct-&gt;hDC, TRANSPARENT );<br />
				if( lpDrawItemStruct-&gt;itemState &amp; ODS_FOCUS )<br />
				{<br />
					oldcolor	= SetTextColor( lpDrawItemStruct-&gt;hDC, GetSysColor( COLOR_HIGHLIGHTTEXT ) );<br />
					FillRect( lpDrawItemStruct-&gt;hDC, &amp;lpDrawItemStruct-&gt;rcItem, GetSysColorBrush( COLOR_HIGHLIGHT ) );<br />
				}<br />
				else<br />
				{<br />
					oldcolor	= SetTextColor( lpDrawItemStruct-&gt;hDC, GetSysColor( COLOR_WINDOWTEXT ) );<br />
					FillRect( lpDrawItemStruct-&gt;hDC, &amp;lpDrawItemStruct-&gt;rcItem, GetSysColorBrush( COLOR_WINDOW ) );<br />
				}<br />
				GetLBText( lpDrawItemStruct-&gt;itemID, text );<br />
				TextOut( lpDrawItemStruct-&gt;hDC,<br />
						lpDrawItemStruct-&gt;rcItem.left + 5 + logfont.lfHeight,<br />
						lpDrawItemStruct-&gt;rcItem.top + 5, text, (int)strlen(text) );<br />
				SetTextColor( lpDrawItemStruct-&gt;hDC, oldcolor );<br />
				SetBkMode( lpDrawItemStruct-&gt;hDC, oldmode );<br />
				if( lpDrawItemStruct-&gt;itemState &amp; ODS_FOCUS )<br />
				{<br />
					DrawFocusRect( lpDrawItemStruct-&gt;hDC, &amp;lpDrawItemStruct-&gt;rcItem );<br />
				}<br />
			}<br />
		}<br />
	}<br />
}<br />
ちなみにコンボボックスのプロパティで		オーナードローを有効にしておいて下さい。<br />
これで完成です。
]]>
</content:encoded>
<dc:creator>dala</dc:creator>
</item>

<item rdf:about="http://program.alphabrend.com/modules/pukiwiki/32.html">
 <title>Word等に貼り付けられるアプリケーション</title>
 <link>http://program.alphabrend.com/modules/pukiwiki/32.html</link>
 <dc:date>2006-05-28T23:08:48+09:00</dc:date>
 <description>WordやExcel,数式エディタなど等は 		各々オブジェクトとして 		貼り付けたり貼り付けあったりすることができます。 		これはOLEという機能を使用しています。 自分でどうやってこのようなプログラムを作成するかというと、 		アプリケーション作成時に 		「複合ドキュメントサポート」で「フルサーバー」を選択します。 あとはVCに付属されているサンプルのHIERSVRを見て 		同じように作成していくと簡単に作ることができます。 ちなみにヘルプなどを見てみるとわかりますが、 		エクスプ...</description>
<content:encoded>
<![CDATA[
WordやExcel,数式エディタなど等は 		各々オブジェクトとして 		貼り付けたり貼り付けあったりすることができます。 		これはOLEという機能を使用しています。<br />
自分でどうやってこのようなプログラムを作成するかというと、 		アプリケーション作成時に 		「複合ドキュメントサポート」で「フルサーバー」を選択します。<br />
あとはVCに付属されているサンプルのHIERSVRを見て 		同じように作成していくと簡単に作ることができます。<br />
ちなみにヘルプなどを見てみるとわかりますが、 		エクスプローラーのサムネイルも 		これで作成することができるようです。
]]>
</content:encoded>
<dc:creator>dala</dc:creator>
</item>

<item rdf:about="http://program.alphabrend.com/modules/pukiwiki/28.html">
 <title>TIPS/VisualC++</title>
 <link>http://program.alphabrend.com/modules/pukiwiki/28.html</link>
 <dc:date>2006-05-28T23:05:38+09:00</dc:date>
 <description>Visual C++によるプログラミングチップスを公開しています。ツールバーに256色(8bit)の画像を使用するフローティング中のツールバーを斜めにサイズ変更できるようにする縦書きエディットコントロール New縦書きコンボボックスCDockBarを継承するwindows98でリッチエディットが動かない？Word等に貼り付けられるアプリケーション...</description>
<content:encoded>
<![CDATA[
Visual C++によるプログラミングチップスを公開しています。<br />
ツールバーに256色(8bit)の画像を使用する<br />
フローティング中のツールバーを斜めにサイズ変更できるようにする<br />
縦書きエディットコントロール New<br />
縦書きコンボボックス<br />
CDockBarを継承する<br />
windows98でリッチエディットが動かない？<br />
Word等に貼り付けられるアプリケーション
]]>
</content:encoded>
<dc:creator>dala</dc:creator>
</item>


</rdf:RDF>