السلام عليكم و رحمة الله و بركاته
أخي العزيز هاني الاتاسي يحفظه الله
لقد أثلج صدري ردك و تفاعلك مع رسالتي كثيرا .. فبارك الله فيك .. للعلم فقط يا أخ هاني أنا لم أبدأ في تعلم اللغة إلا من أربعة أشهر فقط .. بمعنى أنني لست محترفا في هذه اللغة فمنكم إن شاء الله نستفيد و نتعلم المزيد .. و الحمد لله أنني تعرفت على هذا المنتدى الرائع بحق .. و أتمنى فعلا أن نتعاون معا في تخريج برنامج يخدم إخواننا المكفوفين في العالم العربي أجمع .. أما بالنسبة للخوارزمية المتبعة في خلق التوافقية في ضغط مفاتيح لوحة المفاتيح فسأقوم بوضعها هنا و أتمنى أن تزودني بخوارزميتك التي ستكون إن شاء الله أفضل و أسرع ..
أما بالنسبة لقولك خلق توقيع خاص بملفات برايل فلم أفهم المقصود فأرجو إذا تكرمت توضيح ذلك لي ..
CODE2
enum
{
keyD = 0x0001, // bit 0 - key D is down
keyF = 0x0002, // bit 1 - key F is down
keyG = 0x0004, // bit 2 - key G is down
keyJ = 0x0008, // bit 3 - key J is down
keyK = 0x0010, // bit 4 - key K is down
keyL = 0x0020 // bit 5 - key L is down
};
enum
{
vkeycodeD = 0x44,
vkeycodeF = 0x46,
vkeycodeG = 0x47,
vkeycodeJ = 0x4A,
vkeycodeK = 0x4B,
vkeycodeL = 0x4C
};
typedef map KeyMap;
typedef KeyMap::iterator KeyIter;
// exView.cpp : implementation of the CExView class
//
#include "stdafx.h"
#include "ex.h"
#include "exDoc.h"
#include "CntrItem.h"
#include "exView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CExView
IMPLEMENT_DYNCREATE(CExView, CRichEditView)
BEGIN_MESSAGE_MAP(CExView, CRichEditView)
//{{AFX_MSG_MAP(CExView)
ON_WM_DESTROY()
ON_WM_KEYDOWN()
ON_WM_KEYUP()
ON_WM_CHAR()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CRichEditView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CRichEditView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRichEditView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CExView construction/destruction
CExView::CExView()
{
// TODO: add construction code here
m_keyMap[keyF] = 'a'; // alef
m_keyMap[keyF|keyD] = 'b'; //baa
m_keyMap[keyD|keyS|keyJ|keyK] = 't'; // taa
m_keyMap[keyF|keyJ|keyK|keyL] = '?'; //tha
m_keyMap[keyD|keyJ|keyK] = 'j'; // jim
m_keyMap[keyF|keyK|keyL] = ':'; //7a
m_keyMap[keyF|keyS|keyJ|keyL] = 'x'; //kha
m_keyMap[keyF|keyJ|keyK] = 'd'; //dal
m_keyMap[keyD|keyS|keyJ|keyL] = '!';//thal
m_keyMap[keyF|keyD|keyS|keyK] = 'r'; //raa
m_keyMap[keyF|keyS|keyK|keyL] = 'z'; //zai
m_keyMap[keyD|keyS|keyJ] = 's'; //sin
m_keyMap[keyF|keyJ|keyL] = '%'; //shin
m_keyMap[keyF|keyD|keyS|keyJ|keyL] = '&'; //ssad
m_keyMap[keyF|keyD|keyJ|keyL] = '$'; //ddad
m_keyMap[keyD|keyS|keyJ|keyK|keyL] = ')'; //ta`
m_keyMap[keyF|keyD|keyS|keyJ|keyK|keyL] = '='; //dha`
m_keyMap[keyF|keyD|keyS|keyK|keyL] = '('; //ain
m_keyMap[keyF|keyD|keyL] = '<'; //ghain
m_keyMap[keyF|keyD|keyJ] = 'f'; //fa
m_keyMap[keyF|keyD|keyS|keyJ|keyK] = 'q'; //gaf
m_keyMap[keyF|keyS] = 'k'; //kaf
m_keyMap[keyF|keyD|keyS] = 'l'; //lam
m_keyMap[keyF|keyS|keyJ] = 'm'; //mim
m_keyMap[keyF|keyS|keyJ|keyK] = 'n'; //nun
m_keyMap[keyF|keyD|keyK] = 'h'; //ha
m_keyMap[keyD|keyJ|keyK|keyL] = 'w'; //waw
m_keyMap[keyD|keyJ] = 'i'; //yea
}
CExView::~CExView()
{
}
BOOL CExView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CRichEditView::PreCreateWindow(cs);
}
void CExView::OnInitialUpdate()
{
CRichEditView::OnInitialUpdate();
CHARFORMAT cf;
cf.cbSize = sizeof (CHARFORMAT);
cf.dwMask = CFM_SIZE|CFM_FACE;
cf.dwEffects=0;
cf.yHeight=300;
::lstrcpy (cf.szFaceName, "SimBraille");
CRichEditView::SetCharFormat (cf);
// Set the printing margins (720 twips = 1/2 inch).
SetMargins(CRect(720, 720, 720, 720));
}
/////////////////////////////////////////////////////////////////////////////
// CExView printing
BOOL CExView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CExView::OnDestroy()
{
// Deactivate the item on destruction; this is important
// when a splitter view is being used.
CRichEditView::OnDestroy();
COleClientItem* pActiveItem = GetDocument()->GetInPlaceActiveItem(this);
if (pActiveItem != NULL && pActiveItem->GetActiveView() == this)
{
pActiveItem->Deactivate();
ASSERT(GetDocument()->GetInPlaceActiveItem(this) == NULL);
}
}
/////////////////////////////////////////////////////////////////////////////
// CExView diagnostics
#ifdef _DEBUG
void CExView::AssertValid() const
{
CRichEditView::AssertValid();
}
void CExView::Dump(CDumpContext& dc) const
{
CRichEditView::Dump(dc);
}
CExDoc* CExView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CExDoc)));
return (CExDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CExView message handlers
BOOL CExView::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
return CRichEditView::PreTranslateMessage(pMsg);
}
void CExView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
switch ( nChar )
{
case vkeycodeD: m_nKeyFlags|=keyD; m_nKeyCnt++; m_fInProcess=TRUE; break;
case vkeycodeF: m_nKeyFlags|=keyF; m_nKeyCnt++; m_fInProcess=TRUE; break;
case vkeycodeJ: m_nKeyFlags|=keyJ; m_nKeyCnt++; m_fInProcess=TRUE; break;
case vkeycodeK: m_nKeyFlags|=keyK; m_nKeyCnt++; m_fInProcess=TRUE; break;
case vkeycodeL: m_nKeyFlags|=keyL; m_nKeyCnt++; m_fInProcess=TRUE; break;
case vkeycodeS: m_nKeyFlags|=keyS; m_nKeyCnt++; m_fInProcess=TRUE; break;
case 'b':
case 't':
case 'r':
case 'n':
case ' ':
CRichEditView::OnKeyDown(nChar, nRepCnt, nFlags);
break;
default:
MessageBeep( MB_ICONASTERISK ); // error
m_nKeyFlags= 0; // start fresh for next key
m_fInProcess= FALSE;
m_nKeyCnt= 0;
return;
}
//CRichEditView::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CExView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
m_nKeyCnt--;
if ( m_fInProcess && (m_nKeyCnt <= 0) ) {
DoAction(); // decode flag bit to a letter and display it
m_nKeyFlags= 0; // start fresh for next key
m_fInProcess= FALSE;
m_nKeyCnt= 0;
}
//CRichEditView::OnKeyUp(nChar, nRepCnt, nFlags);
}
void CExView::DoAction()
{
KeyIter itFound = m_keyMap.find (m_nKeyFlags);
KeyIter itEnd= m_keyMap.end();
if ( itFound == itEnd ){
MessageBeep( MB_ICONASTERISK ); // error
return; // No action registered for a specified key
}
char chAction = (*itFound).second;
// Do the action
// e.g. send WM_CHAR
DefWindowProc(WM_CHAR, chAction, 0);
}
void CExView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
switch (nChar)
{
case 'b': // backspace
CView::OnChar(nChar,nRepCnt,nFlags);
break ;
case 't': // tab
CView::OnChar(nChar,nRepCnt,nFlags);
break ;
case 'n': // line feed
CView::OnChar(nChar,nRepCnt,nFlags);
break ;
case 'r': // carriage return
CView::OnChar(nChar,nRepCnt,nFlags);
break ;
case ' ': // Space key
CView::OnChar(nChar,nRepCnt,nFlags);
break ;
default: // character codes
if ((toupper(nChar)=='F') ||(toupper(nChar)=='D')
|| (toupper(nChar)=='S') || (toupper(nChar)=='J')
|| (toupper(nChar)=='K') || (toupper(nChar)=='L'))
{
// don't do anything this is used to block unwanted charecters
}
}
//CRichEditView::OnChar(nChar, nRepCnt, nFlags);
}