stoneage8.5/石器时代8.5客户端最新源代码/石器源码/system/font.cpp

456 lines
14 KiB
C++
Raw Permalink Normal View History

2020-06-23 15:53:23 +08:00
#include "../systeminc/version.h"
2020-06-23 15:27:59 +08:00
#include "../systeminc/system.h"
#define ASCII(a) a-'A'+10
#define ASCII_DEC(a) a-'0'+ 35
#define FONT_BUFFER_SIZE 1024 // ???????????
// ?????????
FONT_BUFFER FontBuffer[ FONT_BUFFER_SIZE ];
int FontCnt = 0;
int FontZenkauWidth;
int FontHankakuWidth;
int MessageBoxNew(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);
#ifdef _SUNDAY_STR_SEARCH
char* sunday( char* str, char* subStr)
{
const int maxSize=256;
int next[maxSize];
int strLen = strlen(str);
int subLen = strlen(subStr);
int i,j,pos;
for(i=0;i<maxSize;i++)
{
next[i] = subLen+1;
}
for(i=0;i<subLen;i++)
{
2020-06-23 15:53:23 +08:00
next[ (unsigned char)subStr[i] ] = subLen-i;//计算子串中的字符到字符串结尾的\0之间的距离
2020-06-23 15:27:59 +08:00
}
pos=0;
while(pos<=(strLen-subLen))
{
i=pos;
for(j=0;j<subLen;j++,i++)
{
if(str[i] != subStr[j])
{
2020-06-23 15:53:23 +08:00
pos += next[ (unsigned char)str[pos+subLen] ];//向后移动
2020-06-23 15:27:59 +08:00
break;
}
}
2020-06-23 15:53:23 +08:00
if(j==subLen)//找到字串,返回
2020-06-23 15:27:59 +08:00
{
return str+pos;
}
}
return NULL;
}
#endif
#ifdef _FONT_SIZE
int StockFontBufferExt( int x, int y, char fontPrio, int color, char *str, BOOL hitFlag, int size )
{
if( FontCnt >= FONT_BUFFER_SIZE ) return -2;
FontBuffer[ FontCnt ].x = x;
FontBuffer[ FontCnt ].y = y;
FontBuffer[ FontCnt ].fontPrio = fontPrio;
FontBuffer[ FontCnt ].color = color;
FontBuffer[ FontCnt ].hitFlag = hitFlag;
2020-06-23 15:53:23 +08:00
extern int ;
extern int ;
if(){
char [1024]={0};
LCMapString (0x804,0x4000000,str, strlen(str),,1024);
if(==950){
2020-06-23 15:27:59 +08:00
extern char* GB2312ToBIG5(const char* szBIG5String);
2020-06-23 15:53:23 +08:00
strcpy( FontBuffer[ FontCnt ].str, GB2312ToBIG5((const char *)) );
2020-06-23 15:27:59 +08:00
}else
2020-06-23 15:53:23 +08:00
strcpy( FontBuffer[ FontCnt ].str, );
2020-06-23 15:27:59 +08:00
}else{
2020-06-23 15:53:23 +08:00
if(==950){
2020-06-23 15:27:59 +08:00
extern char* GB2312ToBIG5(const char* szBIG5String);
strcpy( FontBuffer[ FontCnt ].str, GB2312ToBIG5((const char *)str) );
}else
strcpy( FontBuffer[ FontCnt ].str, str );
}
FontBuffer[ FontCnt ].size = size;
return FontCnt++;
}
int StockFontBuffer( int x, int y, char fontPrio, int color, char *str, BOOL hitFlag )
{
return StockFontBufferExt( x, y, fontPrio, color, str, hitFlag, 0 );
}
#else
int StockFontBuffer( int x, int y, char fontPrio, int color, char *str, BOOL hitFlag )
{
if( FontCnt >= FONT_BUFFER_SIZE ) return -2;
FontBuffer[ FontCnt ].x = x;
FontBuffer[ FontCnt ].y = y;
FontBuffer[ FontCnt ].fontPrio = fontPrio;
FontBuffer[ FontCnt ].color = color;
FontBuffer[ FontCnt ].hitFlag = hitFlag;
2020-06-23 15:53:23 +08:00
extern int ;
extern int ;
if(){
char [1024]={0};
LCMapString (0x804,0x4000000,str, strlen(str),,1024);
strcpy( FontBuffer[ FontCnt ].str, );
2020-06-23 15:27:59 +08:00
}else{
strcpy( FontBuffer[ FontCnt ].str, str );
}
return FontCnt++;
}
#endif
HDC FontSizeHdc=NULL;
HDC hScrDC=NULL;
void CreatFontHdc()
{
hScrDC = CreateDC("FontHdc", NULL, NULL, NULL);
FontSizeHdc = CreateCompatibleDC(hScrDC);
if(FontSizeHdc){
#ifdef _NEWFONT_
2020-06-23 15:53:23 +08:00
extern int ;
2020-06-23 15:27:59 +08:00
char strfame[128];
2020-06-23 15:53:23 +08:00
if(==950){
2020-06-23 15:27:59 +08:00
sprintf(strfame,"Microsoft JhengHei");
}else{
sprintf(strfame,"Microsoft JhengHei");
}
HFONT font=CreateFont(FONT_SIZE1,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,1,
0,0,0,17,(LPCTSTR)strfame);
#else
2020-06-23 15:53:23 +08:00
extern int ;
2020-06-23 15:27:59 +08:00
char strfame[128];
HFONT font;
2020-06-23 15:53:23 +08:00
if(==950){
2020-06-23 15:27:59 +08:00
sprintf(strfame,"Microsoft JhengHei");
font=CreateFont(FONT_SIZE2,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,1,
0,0,0,17,(LPCTSTR)strfame);
}else{
font=CreateFont(FONT_SIZE1,0,0,0,400,FALSE,FALSE,FALSE,134,
2020-06-23 15:53:23 +08:00
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_ROMAN,(LPCTSTR)"宋体");
2020-06-23 15:27:59 +08:00
}
#endif
SelectObject(FontSizeHdc, font);
}else{
2020-06-23 15:53:23 +08:00
MessageBoxNew(NULL,"创建HDC错误","",NULL);
2020-06-23 15:27:59 +08:00
exit(0);
}
}
int getTextLength(char * str)
{
SIZE fontsize;
GetTextExtentPoint32(FontSizeHdc,(LPCSTR)str,strlen(str),(LPSIZE)&fontsize);
return fontsize.cx;
}
#ifdef _MO_CHAT_EXPRESSION
void delFontBuffer(CHAT_BUFFER *chatbuffer)
{
CHAT_BUFFER *pHAIH = chatbuffer->NextChatBuffer;
2020-06-23 15:53:23 +08:00
while(pHAIH) //如果链中还存在结点
2020-06-23 15:27:59 +08:00
{
CHAT_BUFFER* pTemp;
pTemp = pHAIH;
pHAIH = pHAIH->NextChatBuffer;
free(pTemp);
}
chatbuffer->NextChatBuffer=NULL;
}
void NewStockFontBuffer(CHAT_BUFFER *chatbuffer,int x,unsigned char color,char *str,int size)
{
if(!str[0]){
return;
}
memset(chatbuffer,0,sizeof(CHAT_BUFFER));
chatbuffer->fontsize = size;
char outText[512];
char *temp = sunday(str, "#");
if (temp){
if(temp!=str){
int strl = temp-str;
memcpy(outText,str,strl);
outText[strl]=0x0;
SIZE fontsize;
GetTextExtentPoint32(FontSizeHdc,(LPCSTR)outText,strl,(LPSIZE)&fontsize);
chatbuffer->color = color;
chatbuffer->x = x;
strcpy(chatbuffer->buffer,outText);
chatbuffer->NextChatBuffer = (CHAT_BUFFER *)calloc(1,sizeof(CHAT_BUFFER));
NewStockFontBuffer(chatbuffer->NextChatBuffer,x+fontsize.cx,color,temp,size);
}else{
int cnt_int = 0;
int i=1;
for(i;i<4;i++){
if(temp[i]>='0'&& temp[i]<='9'){
cnt_int*=10;
cnt_int+=temp[i]-'0';
}else{
break;
}
}
if(cnt_int>0&&cnt_int<=EXPRESSION_NOID_NUM+1){
chatbuffer->x = x;
chatbuffer->BmpNo = EXPRESSION_NOID_START+cnt_int-1;
temp+=i;
x+=26;
}else{
memcpy(outText,temp,i);
outText[i]=0x0;
SIZE fontsize;
GetTextExtentPoint32(FontSizeHdc,(LPCSTR)outText,i,(LPSIZE)&fontsize);
chatbuffer->color = color;
chatbuffer->x = x;
strcpy(chatbuffer->buffer,outText);
x+=fontsize.cx;
temp+=i;
}
chatbuffer->NextChatBuffer = (CHAT_BUFFER *)calloc(1,sizeof(CHAT_BUFFER));
NewStockFontBuffer(chatbuffer->NextChatBuffer,x,color,temp,size);
}
}else{
chatbuffer->color = color;
chatbuffer->x = x;
strcpy(chatbuffer->buffer,str);
}
}
#endif
void StockFontBuffer2( STR_BUFFER *strBuffer )
{
2020-06-23 15:53:23 +08:00
int lineDist = 0; //行距
2020-06-23 15:27:59 +08:00
int splitPoint = 0;
int bakSplitPoint,cursor;
BOOL SetCursor=FALSE;
char splitStr[ 256 ];
if( FontCnt >= FONT_BUFFER_SIZE ){
strBuffer->hitFontNo = -2;
return;
}
2020-06-23 15:53:23 +08:00
//需要分行时
2020-06-23 15:27:59 +08:00
if( strBuffer->lineLen != 0 ){
cursor=strBuffer->cursor;
while( strlen( strBuffer->buffer + splitPoint ) >= strBuffer->lineLen ){
bakSplitPoint=splitPoint;
2020-06-23 15:53:23 +08:00
//copy一行的字串
2020-06-23 15:27:59 +08:00
strncpy_s( splitStr, strBuffer->buffer + splitPoint, strBuffer->lineLen );
*( splitStr + strBuffer->lineLen ) = NULL;
if( GetStrLastByte( splitStr ) == 3 ){
2020-06-23 15:53:23 +08:00
//分割到中DBCS时退回一个byte
2020-06-23 15:27:59 +08:00
splitPoint = strBuffer->lineLen - 1 + splitPoint;
*( splitStr + strBuffer->lineLen - 1 ) = NULL;
}else
splitPoint = strBuffer->lineLen + splitPoint;
StockFontBuffer( strBuffer->x, strBuffer->y + lineDist, strBuffer->fontPrio, 0, splitStr, 0 );
if(cursor>=bakSplitPoint && cursor<splitPoint){
strBuffer->imeX = strBuffer->x + (cursor-bakSplitPoint)*(FONT_SIZE>>1);
strBuffer->imeY = strBuffer->y + lineDist;
SetCursor=TRUE;
}
lineDist += strBuffer->lineDist;
}
if(!SetCursor){
strBuffer->imeX = strBuffer->x + (strBuffer->cursor-splitPoint)*(FONT_SIZE>>1);
strBuffer->imeY = strBuffer->y + lineDist;
}
StockFontBuffer( strBuffer->x, strBuffer->y + lineDist, strBuffer->fontPrio, 0, strBuffer->buffer + splitPoint, 0 );
}else{
FontBuffer[ FontCnt ].x = strBuffer->x;
FontBuffer[ FontCnt ].y = strBuffer->y;
FontBuffer[ FontCnt ].fontPrio = strBuffer->fontPrio;
FontBuffer[ FontCnt ].color = strBuffer->color;
FontBuffer[ FontCnt ].hitFlag = 0;
#ifdef _FONT_SIZE
FontBuffer[ FontCnt ].size = 0;
#endif
2020-06-23 15:53:23 +08:00
//定义Hook_type用来处理星号产生
#ifdef _SAHOOK //Syu ADD Hook程式
2020-06-23 15:27:59 +08:00
if( strBuffer->filterFlag == HOOK_TYPE){
extern int HOOK_PASSWD_NUM;
for(int i = 0 ; i < HOOK_PASSWD_NUM ; i++)
FontBuffer[ FontCnt ].str[ i ] = '*';
FontBuffer[ FontCnt].str[i]=NULL;
strBuffer->cursor = HOOK_PASSWD_NUM;
}
else if( strBuffer->filterFlag == BLIND_TYPE ){
#else
if( strBuffer->filterFlag == BLIND_TYPE ){
#endif
int i;
for(i = 0 ; i < strBuffer->cnt ; i++ )
FontBuffer[ FontCnt ].str[ i ] = '*';
FontBuffer[ FontCnt ].str[ i ] = NULL;
}else{
2020-06-23 15:53:23 +08:00
extern int ;
if(==950){
2020-06-23 15:27:59 +08:00
extern char* GB2312ToBIG5(const char* szBIG5String);
strcpy( FontBuffer[ FontCnt ].str, GB2312ToBIG5((const char *)strBuffer->buffer));
}else
strcpy( FontBuffer[ FontCnt ].str, strBuffer->buffer);
}
#ifdef _NEWFONT_
char strtemp[512];
char *ptempstr;
if( strBuffer->filterFlag == BLIND_TYPE ){
ptempstr = FontBuffer[ FontCnt ].str;
}else{
ptempstr = strBuffer->buffer;
}
if(strBuffer->cursor==0){
strBuffer->imeX = strBuffer->x;
}else{
memcpy(strtemp,ptempstr,strBuffer->cursor);
strtemp[strBuffer->cursor]=0;
strBuffer->imeX = strBuffer->x + GetStrWidth(strtemp);
}
#else
strBuffer->imeX = strBuffer->x + strBuffer->cursor*(FONT_SIZE>>1);
#endif
strBuffer->imeY = strBuffer->y;
strBuffer->hitFontNo = FontCnt++;
}
}
//ONLINEGM USE
int StockFontBuffer3( STR_BUFFER *strBuffer )
{
2020-06-23 15:53:23 +08:00
int lineDist = 0; //行距
2020-06-23 15:27:59 +08:00
int splitPoint = 0;
int bakSplitPoint,cursor;
BOOL SetCursor=FALSE;
char splitStr[ 256 ];
cursor=strBuffer->cursor;
2020-06-23 15:53:23 +08:00
//需要分行时
2020-06-23 15:27:59 +08:00
while( strlen( strBuffer->buffer + splitPoint ) >= (unsigned)strBuffer->lineLen-1 ){
bakSplitPoint=splitPoint;
2020-06-23 15:53:23 +08:00
strcpy( splitStr , strBuffer->buffer + splitPoint ); //一个字
*( splitStr + strBuffer->lineLen ) = NULL; //指向最后
2020-06-23 15:27:59 +08:00
splitPoint = strBuffer->lineLen + splitPoint;
StockFontBuffer( strBuffer->x, strBuffer->y , strBuffer->fontPrio, 0 , splitStr, 0 );
if(cursor>=bakSplitPoint && cursor<splitPoint){
strBuffer->imeX = strBuffer->x + (cursor-bakSplitPoint)*(FONT_SIZE>>1);
strBuffer->imeY = strBuffer->y + lineDist;
SetCursor=TRUE;
}
lineDist += strBuffer->lineDist;
return 1;
}
2020-06-23 15:53:23 +08:00
if(!SetCursor){ // 游标不需换行
2020-06-23 15:27:59 +08:00
strBuffer->imeX = strBuffer->x + (strBuffer->cursor-splitPoint)*(FONT_SIZE>>1);
strBuffer->imeY = strBuffer->y + lineDist;
}
StockFontBuffer( strBuffer->x, strBuffer->y + lineDist, strBuffer->fontPrio, 0 , strBuffer->buffer + splitPoint, 0 );
return 0;
}
void StockFontBufferFamily( STR_BUFFER *strBuffer )
{
2020-06-23 15:53:23 +08:00
int lineDist = 0; //行距
2020-06-23 15:27:59 +08:00
int splitPoint = 0;
int bakSplitPoint,cursor;
BOOL SetCursor=FALSE;
char splitStr[ 256 ];
if( FontCnt >= FONT_BUFFER_SIZE ){
strBuffer->hitFontNo = -2;
return;
}
2020-06-23 15:53:23 +08:00
int ;
2020-06-23 15:27:59 +08:00
if( strBuffer->lineLen != 0 ){
cursor=strBuffer->cursor;
2020-06-23 15:53:23 +08:00
if(lineDist) = strBuffer->lineLen;
else = 38;
while( strlen( strBuffer->buffer + splitPoint ) >= ){
2020-06-23 15:27:59 +08:00
bakSplitPoint=splitPoint;
2020-06-23 15:53:23 +08:00
//copy一行的字串
strncpy_s( splitStr, strBuffer->buffer + splitPoint, );
*( splitStr + ) = NULL;
2020-06-23 15:27:59 +08:00
if( GetStrLastByte( splitStr ) == 3 ){
2020-06-23 15:53:23 +08:00
//分割到中DBCS时退回一个byte
splitPoint = - 1 + splitPoint;
*( splitStr + - 1 ) = NULL;
2020-06-23 15:27:59 +08:00
}else
2020-06-23 15:53:23 +08:00
splitPoint = + splitPoint;
2020-06-23 15:27:59 +08:00
if(lineDist)
StockFontBuffer( strBuffer->x-60, strBuffer->y + lineDist, strBuffer->fontPrio, 0, splitStr, 0 );
else
StockFontBuffer( strBuffer->x, strBuffer->y + lineDist, strBuffer->fontPrio, 0, splitStr, 0 );
if(cursor>=bakSplitPoint && cursor<splitPoint){
if(lineDist)
strBuffer->imeX = strBuffer->x-60 + (cursor-bakSplitPoint)*(FONT_SIZE>>1);
else
strBuffer->imeX = strBuffer->x +(cursor-bakSplitPoint)*(FONT_SIZE>>1);
strBuffer->imeY = strBuffer->y + lineDist;
SetCursor=TRUE;
}
lineDist += strBuffer->lineDist;
2020-06-23 15:53:23 +08:00
if(lineDist) = strBuffer->lineLen;
else = 38;
2020-06-23 15:27:59 +08:00
}
if(!SetCursor){
if(lineDist)
strBuffer->imeX = strBuffer->x -60+ (strBuffer->cursor-splitPoint)*(FONT_SIZE>>1);
else
strBuffer->imeX = strBuffer->x + (strBuffer->cursor-splitPoint)*(FONT_SIZE>>1);
strBuffer->imeY = strBuffer->y + lineDist;
}
if(lineDist)
StockFontBuffer( strBuffer->x-60, strBuffer->y + lineDist, strBuffer->fontPrio, 0, strBuffer->buffer + splitPoint, 0 );
else
StockFontBuffer( strBuffer->x, strBuffer->y + lineDist, strBuffer->fontPrio, 0, strBuffer->buffer + splitPoint, 0 );
}else{
FontBuffer[ FontCnt ].x = strBuffer->x;
FontBuffer[ FontCnt ].y = strBuffer->y;
FontBuffer[ FontCnt ].fontPrio = strBuffer->fontPrio;
FontBuffer[ FontCnt ].color = strBuffer->color;
FontBuffer[ FontCnt ].hitFlag = 0;
#ifdef _FONT_SIZE
FontBuffer[ FontCnt ].size = 0;
#endif
2020-06-23 15:53:23 +08:00
//定义Hook_type用来处理星号产生
#ifdef _SAHOOK //Syu ADD Hook程式
2020-06-23 15:27:59 +08:00
if( strBuffer->filterFlag == HOOK_TYPE){
extern int HOOK_PASSWD_NUM;
for(int i = 0 ; i < HOOK_PASSWD_NUM ; i++)
FontBuffer[ FontCnt ].str[ i ] = '*';
FontBuffer[ FontCnt].str[i]=NULL;
strBuffer->cursor = HOOK_PASSWD_NUM;
}
else if( strBuffer->filterFlag == BLIND_TYPE ){
#else
if( strBuffer->filterFlag == BLIND_TYPE ){
#endif
int i;
for(i = 0 ; i < strBuffer->cnt ; i++ )
FontBuffer[ FontCnt ].str[ i ] = '*';
FontBuffer[ FontCnt ].str[ i ] = NULL;
}else {
2020-06-23 15:53:23 +08:00
extern int ;
if(==950){
2020-06-23 15:27:59 +08:00
extern char* GB2312ToBIG5(const char* szBIG5String);
strcpy( FontBuffer[ FontCnt ].str, GB2312ToBIG5((const char *)strBuffer->buffer) );
}else
strcpy( FontBuffer[ FontCnt ].str, strBuffer->buffer );
}
strBuffer->imeX = strBuffer->x - 60+strBuffer->cursor*(FONT_SIZE>>1);
strBuffer->imeY = strBuffer->y;
strBuffer->hitFontNo = FontCnt++;
}
}