📄 testw32dlg.cpp
字号:
/*********************************************************//* Test program driver for freetype on Win32 Platform *//* CopyRight(left) G. Ramat 1998 (gcramat@radiostudio.it)*//* *//*********************************************************/// testw32Dlg.cpp : implementation file//#include "stdafx.h"#include "testw32.h"#include "testw32dlg.h"#include "gdriver.h"#include "gevents.h"#include <fcntl.h>#include <errno.h>#include <io.h>CWnd *button_OK,*button_Cancel;DWORD thrd_spool; // output spoolerHANDLE spool_thread;//Sync data:extern "C" { HANDLE evgetevent,evdriverdisplaybitmap,this_cwnd,main_thread,listbox,bitmap; TEvent evevent; char *ev_buffer; int ev_lines,ev_columns; char *save_buffer; int save_lines,save_cols,exit_code; int ftview(int,char**); int ftdump(int,char**); int ftlint(int,char**); int ftstring(int,char**); int ftstrpnm(int,char**); int ftzoom(int,char**); int call_test_program(int (*)(int,char**),int,char **);}//pipe handling variables int pipe_std[2]={2*0},pipe_err[2]={2*0},error;int old_std,old_err;//end of pipe handling variables#define TEST_PROG_N 4//Sync data endchar ProgramName[16];char fontname[16]; char fullfont[MAX_PATH];char *argv[255];int argc;DWORD WINAPI ThreadHead(LPVOID );DWORD WINAPI ThreadSpool(LPVOID );void readpipe(int);#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifextern main(int,char **);extern int X_Link;/////////////////////////////////////////////////////////////////////////////// CTestw32Dlg dialogCTestw32Dlg::CTestw32Dlg(CWnd* pParent /*=NULL*/) : CDialog(CTestw32Dlg::IDD, pParent){ //{{AFX_DATA_INIT(CTestw32Dlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CTestw32Dlg::DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTestw32Dlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CTestw32Dlg, CDialog) //{{AFX_MSG_MAP(CTestw32Dlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_SELECT_ACTION, OnSelectAction) ON_WM_DESTROY() //}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CTestw32Dlg message handlersBOOL CTestw32Dlg::OnInitDialog(){ int error; FILE *retf; CDialog::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here //save CWnd objects for utility fns; evgetevent=CreateEvent(NULL,FALSE,FALSE,"Get_Event"); evdriverdisplaybitmap=CreateEvent(NULL,FALSE,FALSE,"Driver_Display_Bitmap"); listbox=(GetDlgItem(IDC_LIST_BOX))->m_hWnd; bitmap=(GetDlgItem(IDC_BITMAP))->m_hWnd; button_OK=GetDlgItem(IDOK); button_Cancel=GetDlgItem(IDCANCEL); error=_pipe(pipe_std,1024,_O_TEXT);// error=_pipe(pipe_err,1024,_O_TEXT); // enable piping if(-1==_fileno(stdout)) {retf=freopen("throwaway_stdout.tmp","wt",stdout); } if(-1==_fileno(stderr)) {retf=freopen("throwaway_stderr.tmp","wt",stderr); } old_std=dup(_fileno(stdout)); old_err=dup(_fileno(stderr)); error=dup2(pipe_std[1],_fileno(stdout)); error=dup2(pipe_std[1],_fileno(stderr)); //error=dup2(pipe_err[1],_fileno(stderr)); save_buffer=NULL;// error=write(pipe_std[1],"Pipe_test:Write\n",16);// error=fprintf(stdout,"Pipe_test:fprintf");// error=fflush(stdout);// activate spooler spool_thread=CreateThread(NULL,0,ThreadSpool,NULL,0,&thrd_spool); return TRUE; // return TRUE unless you set the focus to a control}// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void CTestw32Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); }}// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSOR CTestw32Dlg::OnQueryDragIcon(){ return (HCURSOR) m_hIcon;}void CTestw32Dlg::OnOK() { DWORD thrd_id; char Options[256]; char *p,*pb,*pe; int i; // TODO: Add extra validation here GetDlgItemText(IDC_TEST_PROGRAM,ProgramName,sizeof(ProgramName)-1); GetDlgItemText(IDC_OPTIONS,Options,sizeof(Options)-1); argv[0]=ProgramName; p=Options; i=1; while (*p!=0) { while (*p==' ') p++; pb=p; while (*p>' ') p++; pe=p; if (pe>pb) { argv[i]=new char[1+pe-pb]; strncpy(argv[i],pb,pe-pb); argv[i][pe-pb]=0; i++; } } argv[0]=ProgramName; argc=i; main_thread=CreateThread(NULL,0,ThreadHead,NULL,0,&thrd_id); // CDialog::OnOK();}DWORD WINAPI ThreadHead(LPVOID Parm){ int i,rc;struct { char pname[16]; int (*program)(int,char**);} tab[TEST_PROG_N]={ {"FTVIEW",&ftview}, {"FTDUMP",&ftdump}, {"FTLINT",&ftlint}, {"FTSTRING",&ftstring}// {"FTSTRPNM",&ftstrpnm},// {"FTZOOM",&ftzoom}};//disable Ok button rc=button_OK->EnableWindow(FALSE); rc=button_Cancel->EnableWindow(FALSE); for (i=0;(i< TEST_PROG_N) &&strcmp(tab[i].pname,ProgramName);i++); if (i>= TEST_PROG_N) { MessageBox(NULL,"Please select a valid Test Program Name","FreeType Test ",MB_ICONQUESTION); } else call_test_program(tab[i].program,argc,(char **)&argv); //enable buttons again rc=button_OK->EnableWindow(TRUE); rc=button_Cancel->EnableWindow(TRUE); rc=fflush(stdout); rc=fflush(stderr); ExitThread(1); return 1;}void translate_command(char nChar) { int rc,i; // TODO: Add your message handler code here and/or call default typedef struct _Translator { char key; GEvent event_class; int event_info; } Translator;#define NUM_Translators 20 static const Translator trans[ NUM_Translators] = { { 'q', event_Quit, 0 }, { (char)27, event_Quit, 0 }, { 'x', event_Rotate_Glyph, -1 }, { 'c', event_Rotate_Glyph, 1 }, { 'v', event_Rotate_Glyph, -16 }, { 'b', event_Rotate_Glyph, 16 }, { '{', event_Change_Glyph, -10000 }, { '}', event_Change_Glyph, 10000 }, { '(', event_Change_Glyph, -1000 }, { ')', event_Change_Glyph, 1000 }, { '9', event_Change_Glyph, -100 }, { '0', event_Change_Glyph, 100 }, { 'i', event_Change_Glyph, -10 }, { 'o', event_Change_Glyph, 10 }, { 'k', event_Change_Glyph, -1 }, { 'l', event_Change_Glyph, 1 }, { '+', event_Scale_Glyph, 10 }, { '-', event_Scale_Glyph, -10 }, { 'u', event_Scale_Glyph, 1 }, { 'j', event_Scale_Glyph, -1 } }; for ( i = 0; i < NUM_Translators; i++ ) { if ( nChar == trans[i].key ) { evevent.what = trans[i].event_class; evevent.info = trans[i].event_info; break; } } if (i>= NUM_Translators) { evevent.what=event_Keyboard; evevent.what=nChar; } rc=SetEvent(evgetevent);}void CTestw32Dlg::OnSelectAction() { char c[2]; GetDlgItemText(IDC_ACTION,c,2); translate_command(c[0]);}DWORD WINAPI ThreadSpool(LPVOID Parm){ while(1) { if (pipe_std[0]) readpipe(pipe_std[0]); // will never get out of there !!!!// if (pipe_err[0]) readpipe(pipe_err[0]); Sleep(1000); } return 1;} void readpipe(int h) { int i,j,rc; char buffer[1024],line[1024]; rc=1; while(rc) { rc=read(h,buffer,sizeof(buffer)); if (rc) { j=0; for(i=0;i<rc;i++) { if (buffer[i]=='\n') { line[j]=0; ::SendMessage((HWND)listbox,LB_ADDSTRING,0,(LPARAM)line); j=0; } else line[j++]=buffer[i]; } line[j]=0; //flush the buffer ::SendMessage((HWND)listbox,LB_ADDSTRING,0,(LPARAM)line); } }}void CTestw32Dlg::OnDestroy() { int rc; CDialog::OnDestroy(); if (spool_thread!=0) { rc=TerminateThread(spool_thread,2); spool_thread=0; } dup2(old_std,_fileno(stdout)); dup2(old_err,_fileno(stderr));}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -