home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 2001 December (DVD)
/
VPR0112A.ISO
/
OLS
/
DEN8_131
/
Den8_32.1.3.1_Red_L.lzh
/
MainFrm.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1996-08-11
|
9KB
|
367 lines
// MainFrm.cpp : CMainFrame クラスの動作の定義を行います。
//
#include "stdafx.h"
#include "DdeClient.h"
#include "MainFrm.h"
#include "CommandDialog.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
void DoEvents(int nTimes)
{
MSG msg;
for (int i = 0; i < nTimes; i++)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (!TheApp.PreTranslateMessage(&msg)) // これ追加してみました
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_MESSAGE(WM_DDE_ACK, OnDdeAck)
ON_COMMAND(ID_EDIT_PASTE_LINK, OnEditPasteLink)
ON_MESSAGE(WM_DDE_TERMINATE, OnDdeTerminate)
ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE_LINK, OnUpdateEditPasteLink)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // ステータス ライン インジケータ
ID_INDICATOR_KANA,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame クラスの構築/消滅
CMainFrame::CMainFrame()
{
// TODO: この位置にメンバの初期化処理コードを追加してください。
m_status = NONE;
m_hwndServer = NULL;
}
CMainFrame::~CMainFrame()
{
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.Create(this) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // 作成に失敗
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // 作成に失敗
}
// TODO: もしツール チップスが必要ない場合、ここを削除してください。
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
// TODO: ツール バーをドッキング可能にしない場合は以下の3行を削除
// してください。
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: この位置で CREATESTRUCT cs を修正して、Window クラスやスタイルを
// 修正してください。
CString sSection("Main Frame");
cs.x = TheApp.GetProfileInt(sSection, "Left", 0);
cs.y = TheApp.GetProfileInt(sSection, "Top", 0);
cs.cx = TheApp.GetProfileInt(sSection, "Width", 256);
cs.cy = TheApp.GetProfileInt(sSection, "Height", 128);
return CFrameWnd::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame クラスの診断
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame メッセージ ハンドラ
LONG CMainFrame::OnDdeAck(WPARAM wParam, LPARAM lParam)
{
switch (m_status)
{
case INITIATE:
m_hwndServer = (HWND)wParam;
m_status = IDLE;
break;
case TRANSACT:
DDEACK ack;
HGLOBAL hCommand;
UnpackDDElParam(WM_DDE_ACK, lParam, (UINT*)&ack, (UINT*)&hCommand);
GlobalFree(hCommand);
char cBuf [128];
wsprintf(cBuf, "%02x", ack.bAppReturnCode & 0xff);
AfxMessageBox(cBuf);
m_status = IDLE;
break;
case TERMINATE:
case NONE:
case IDLE:
MessageBeep(MB_OK);
break;
}
return 1;
}
void CMainFrame::OnEditPasteLink()
{
switch (m_status)
{
case NONE:
DDEInitiate();
break;
case IDLE:
DDETerminate();
break;
case INITIATE:
case TRANSACT:
case TERMINATE:
MessageBeep(MB_ICONHAND);
break;
}
}
void CMainFrame::DDEInitiate()
{
m_status = INITIATE;
if (m_pViewActive)
m_pViewActive->EnableWindow(FALSE);
m_wndToolBar.LoadToolBar(IDR_MAINFRAME);
CString sApp = TheApp.GetProfileString("DDE", "App", "Den8");
ATOM aApp = GlobalAddAtom(sApp);
if (aApp == 0)
{
AfxMessageBox("booo");
m_status = NONE;
return;
}
CString sTopic = TheApp.GetProfileString("DDE", "Topic", "Command");
ATOM aTopic = GlobalAddAtom(sTopic);
if (aTopic == 0)
{
GlobalDeleteAtom(aApp);
AfxMessageBox("booo");
m_status = NONE;
return;
}
char cMessage[128];
wsprintf(cMessage, "Initiating: App=%s Topic=%s", (LPCSTR)sApp, (LPCSTR)sTopic);
AfxMessageBox(cMessage, MB_ICONINFORMATION);
::SendMessage(HWND_BROADCAST, WM_DDE_INITIATE, (WPARAM)m_hWnd, MAKELPARAM(aApp, aTopic));
GlobalDeleteAtom(aApp);
GlobalDeleteAtom(aTopic);
if (m_hwndServer == NULL)
{
AfxMessageBox("サーバが応答しません。サーバを起動してから、\n[編集]->[リンク貼り付け]を実行してください");
m_status = NONE;
return;
}
if (m_pViewActive)
m_pViewActive->EnableWindow(TRUE);
m_wndToolBar.LoadToolBar(IDR_MAINFRAME1);
m_status = IDLE;
}
void CMainFrame::DDETerminate()
{
m_status = TERMINATE;
if (::PostMessage(m_hwndServer, WM_DDE_TERMINATE, (WPARAM)m_hWnd, 0) == FALSE)
{
m_status = NONE;
return;
}
if (m_pViewActive)
m_pViewActive->EnableWindow(FALSE);
m_wndToolBar.LoadToolBar(IDR_MAINFRAME);
for (DWORD dwBegin = GetTickCount(); m_status == TERMINATE && GetTickCount() - dwBegin < 8000; )
{
Sleep(100);
DoEvents(32);
}
}
LONG CMainFrame::OnDdeTerminate(WPARAM wParam, LPARAM lParam)
{
switch (m_status)
{
case TERMINATE:
m_status = NONE;
break;
case IDLE:
case TRANSACT:
::PostMessage(m_hwndServer, WM_DDE_TERMINATE, (WPARAM)m_hWnd, 0);
m_status = NONE;
if (m_pViewActive)
m_pViewActive->EnableWindow(FALSE);
m_wndToolBar.LoadToolBar(IDR_MAINFRAME);
break;
case INITIATE:
case NONE:
MessageBeep(0xffffffff);
break;
}
return 1;
}
void CMainFrame::OnUpdateEditPasteLink(CCmdUI* pCmdUI)
{
if (m_status == NONE)
{
pCmdUI->SetText("リンク貼り付け(&L)");
}
else
{
pCmdUI->SetText("リンク解除(&L)");
}
}
void CMainFrame::OnDestroy()
{
CString sSection("Main Frame");
CRect rc;
GetWindowRect(rc);
TheApp.WriteProfileInt(sSection, "Left", rc.left);
TheApp.WriteProfileInt(sSection, "Top", rc.top);
TheApp.WriteProfileInt(sSection, "Width", rc.Width());
TheApp.WriteProfileInt(sSection, "Height", rc.Height());
CFrameWnd::OnDestroy();
}
BOOL CMainFrame::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle, CWnd* pParentWnd, CCreateContext* pContext)
{
dwDefaultStyle &= ~FWS_ADDTOTITLE;
return CFrameWnd::LoadFrame(nIDResource, dwDefaultStyle, pParentWnd, pContext);
}
BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)
{
if (wParam == ID_DO_TEST)
{
DoTest((LPCSTR)lParam);
return TRUE;
}
return CFrameWnd::OnCommand(wParam, lParam);
}
void CMainFrame::DoTest(LPCSTR pszCommandLine)
{
if (m_status != IDLE)
{
MessageBeep(MB_ICONHAND);
return;
}
m_status = TRANSACT;
HGLOBAL hCommand;
if (!(hCommand = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, strlen(pszCommandLine) + 1)))
{
AfxMessageBox("fail");
m_status = IDLE;
return;
}
char* pszCommand;
if (!(pszCommand = (char*)GlobalLock(hCommand)))
{
GlobalFree(hCommand);
AfxMessageBox("fail");
m_status = IDLE;
return;
}
strcpy(pszCommand, pszCommandLine);
GlobalUnlock(hCommand);
LPARAM lParam = PackDDElParam(WM_DDE_EXECUTE, 0, (UINT)hCommand);
if (::PostMessage(m_hwndServer, WM_DDE_EXECUTE, (WPARAM)m_hWnd, lParam) == FALSE)
{
GlobalFree(hCommand);
FreeDDElParam(WM_DDE_EXECUTE, lParam);
AfxMessageBox("post error");
m_status = IDLE;
return;
}
for (DWORD dwBegin = GetTickCount(); m_status == TRANSACT && GetTickCount() - dwBegin < 120000; )
{
Sleep(250);
DoEvents(32);
}
}