לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #3  
ישן 14-09-2006, 23:20
  munchiues+ munchiues+ אינו מחובר  
 
חבר מתאריך: 13.09.06
הודעות: 5
בתגובה להודעה מספר 2 שנכתבה על ידי רוני חן שמתחילה ב "שלום לך... השלבים הם ככה: 1...."


CreateCompatibleDC מיועד ליצור DC בזכרון אשר תואם לDC הקיים המאפיין את התצוגה כך שכל מאפייני התצוגה מועברים אליו.
מאחר שאין תצוגה אני צריך ליצור DC ולאפיין אותו ע"י הפונקציה CreateDC .
אני לא ממש מבין את הפרמטרים שהוא לוקח.
הנה הפונקציה מMSDN:
#########
The CreateDC function creates a device context (DC) for a device using the specified name.

HDC CreateDC(
LPCTSTR lpszDriver, // driver name
LPCTSTR lpszDevice, // device name
LPCTSTR lpszOutput, // not used; should be NULL
CONST DEVMODE* lpInitData // optional printer data
);
#####################

מה שאני צריך זה ליצור פונקציה אשר תבצע:
1) BITMAP ריק בזכרון
2)לצייר בתוכו ב GDI(למשל מלבן עם טקסט במרכזו)
3) ואז למשוך את כל הבייטים של כל הפיקסלים שלו ולהזין אותם ל BUFFER
4)להשמיד את ה-BITMAP וכל שאר האובייקטים
-הפונקציה תחזיר לי את ה-BUFFER
זהו

ה BITMAP לא יוצג בכל תצוגה או חלון אני צריך את הבייטים של כל פיקסל.
יש לך רעיון איך??? או דוגמת קוד
בבקשה
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #4  
ישן 15-09-2006, 05:09
  רוני חן רוני חן אינו מחובר  
 
חבר מתאריך: 18.07.06
הודעות: 25
שלח הודעה דרך MSN אל רוני חן
בתגובה להודעה מספר 3 שנכתבה על ידי munchiues+ שמתחילה ב "..."

עדיף ליצור DC על ידי DC קיים כיון שכך לא צריך להתעסק עם כל מיני הגדרות של ה DC ולסבך את העסק. ה DC שתיצור לא יופיע בשום מקום.
בכדי לצייר עם הפונקציות של ווינדוס אתה צריך DC, אי אפשר לצייר על ביטמאפ עם הפונקציות האלו אלא רק על ידי קביעת הביטים של התמונה בהתאם לצורה שאתה רוצה וזה דורש המון זמן וידע כגון הנוסחאות של הקו, העיגול, האליפסה ואינרפולציות כדי להוריד פיקסלים מיותרים.
לכן הדרך הכי טובה לך לעשות את זה היא ליצור DC כמו שאמרתי על ידי הפונקציה CreateCompatibleDC לאחר מכן כדי לאפס את התמונה שיש עליה כרגע(למשל התמונה של החלון שממנו יצרת) אתה צריך לצייר ריבוע בצבע אחיד על כל ה DC, לחילופין אתה יכול ליצור ביטמאפ ולהצמיד אותו ל DC החדש על ידי SelectObject. כשיש לך DC מאופס עם כל הגדרות התצוגה המתאימות(כי יצרת DC מוכן) אתה מתחיל לצייר עליו עם הפונקציות ציור של ווינדוס.
אחרי שציירת אתה יכול להעביר אותו לביטמאפ חדש על ידי הפונקציה CreateCompatibleBitmap ולהרוס את ה DC שיצרת וכעת יש לך ביטמאפ עם ציורים עליו.
אם תרצה לקבל את הביטים ולא לקבל את מזהה הביטמאפ תוכל לפני שאתה מוחק את ה DC לקבלם על ידי הפונקציה GetDIBits, אני מניח שאתה יודע את השימוש בה כיון שהוא קצת מסובך.


אין לי מושג מה עוד יש להסתבך וכדי שלא תחשוב שאני סתם ממציא בלי לבדוק אז אני זה שתיכנתתי את המחלקה הבאה http://www.dr-vb.co.il/show.php?id=685 יש המון סיכוי שאיתה תצליח לעשות מה שאתה רוצה בלי לעבוד על זה אבל אני עדיין לא יודע בדיוק מה אתה רוצה ככה שאני רק ממליץ.

בהצלחה


תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #5  
ישן 16-09-2006, 02:06
  munchiues+ munchiues+ אינו מחובר  
 
חבר מתאריך: 13.09.06
הודעות: 5
בתגובה להודעה מספר 4 שנכתבה על ידי רוני חן שמתחילה ב "עדיף ליצור DC על ידי DC קיים..."

רוני שלום
תודה רבה על העזרה.
אני מנסה לבנות פלאג אין מסויים ל ACTIVEX מסוים.
אני יודע שזה אפשרי לקבל את ה DC שלו אך מאוד מסובך בשבילי מאחר שאני מתכנת ב C# והידע שלי בC++
הוא בסיסי וגם ככה עליתי פה לרף שגבוהה הרבה מהידע שלי בC++.
בכל מקרה אחרי הרבה בדיקות ונסיונות:
ראשית מאחר שאין לי DC מאותחל שאני מקבל מהאפליקציה הדרך היחידה ליצור DC היא ע"י הפונקציה:
(hDC=CreateCompatibleDC(NULL
אני שם NULL
עכשיו כל הנסיונות ליצור BITMAP ולצבוע אותו לא צלחו מאחר שהוא יצא בפורמט GRAYSCALE בגלל שה DC =NULL
אך ניסיון אחד הצליח ע"י העלאת BITMAP מה-RESOURCE בחירה שלו:
bmpExercising=LoadBitmap(hInst, MAKEINTRESOURCE(IDB_EXERCISING));
SelectObject(hDC,bmpExercising);

ושורה אחרי להגדיר אותו מחדש:
bmpExercising = CreateDIBitmap(hDC, &bmih, CBM_INIT, lpBits, &bmi, DIB_RGB_COLORS);
אם תסתכל ב MSDN תבין שכדי ליצור CreateDIBitmap צריך להגדיר שתי מבנים ומערך אחד לאתחל את הפיקסלים:
1)
BITMAPINFOHEADER bmih;
bmih.biSize = sizeof(BITMAPINFOHEADER);
bmih.biWidth = 100;
bmih.biHeight = 100;
bmih.biPlanes = 1;
bmih.biBitCount = 32;
bmih.biCompression = BI_RGB;//no compression
bmih.biSizeImage = 0;//can be 0 since BI_RGB is being used
bmih.biXPelsPerMeter = 0;//not needed
bmih.biYPelsPerMeter = 0;//not needed
bmih.biClrUsed = 3;//maximum colours
bmih.biClrImportant = 0;//worth setting? no.
2)
BITMAPINFO bmi;
bmi.bmiHeader = bmih;
bmi.bmiColors[0].rgbBlue = 0;//no palette
bmi.bmiColors[0].rgbGreen = 0;//no palette
bmi.bmiColors[0].rgbRed = 0;//no palette
bmi.bmiColors[0].rgbReserved = 0;//no palette
3)
unsigned long int *lpBits = new unsigned long int[10000];
for (int i = 0; i < 100; i++)
{
for (int j = 0; j < 100; j++)
{
lpBits[count++] = 0x00CC3300;

}
להזין את הפונקציה-
bmpExercising = CreateDIBitmap(hDC, &bmih, CBM_INIT, lpBits, &bmi, DIB_RGB_COLORS);

עכשיו ניתן לצייר על גבי ה DC ב 32BIT
ולמלא BUFFER אם כל הנתונים של כל פיקסל
בינתיים עוד לא מימשתי את זה למטרה שלי ,אני מקווה שזה יצליח לי בסוף
אם יש לך רעיונות טובים יותר אשמח לשמוע.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #6  
ישן 16-09-2006, 21:35
  רוני חן רוני חן אינו מחובר  
 
חבר מתאריך: 18.07.06
הודעות: 25
שלח הודעה דרך MSN אל רוני חן
בתגובה להודעה מספר 5 שנכתבה על ידי munchiues+ שמתחילה ב "רוני שלום תודה רבה על..."

למען האמת אני מתכנת ב VB6 ושם אני מקבל את ה DC על ידי מאפיין שיש לכל אובייקט, אני לא יודע בדיוק איך זה עובד ב C++ אבל נראה לי שחייבת להיות דרך לקבל את ה DC של הטופס וממנו ליצור DC ל AcitvX שאתה צריך, אם יש לך את מזהה החלון(hWnd) תוכל לקבל את ה DC על ידי הפונקציה GetDC.
בכל אופן אני לא חושב שבשביל זה אתה צריך להשתמש ב CreateDIBitmap היא סתם יותר מסובכת, אני תמיד השתמשתי ב CreateBitmap ולא נתקלתי אף פעם בבעיות.
חוצמזה לא נראה לי שהתמונה יצאה בפורמט אפור בגלל הפונקציה אלא בגלל ה DC כמו שאמרת, אם כן מה זה משנה אם תשתמש בפונקציה שונה הרי הבעיה היא רק בהצגת התמונה, ובזיכרון התצוגה היא נמצאת בפורמט מתאים. כל פעם שווינדוס מציגה תמונה או איזשהו דבר ב DC היא ממירה אותו להגדרות של ה DC למשל אם יהיה לך DC שמציג ב 256 צבעים ותרצה להציג בתוכו תמונה של 32 סיביות אז ווינדוס תמיר אוטומטית את התמונה בזמן ההצגה.
יותר מזה אני לא יכול לעזור לך כי אני לא יודע כיצד עובדת הארכיטקטורה של יצירת החלונות ב C++.

בכל אופן שיהיה בהצלחה
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 21:39

הדף נוצר ב 0.05 שניות עם 12 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר